문제

PHP에서 단수 값 분해 (SVD)를 구현하고 싶습니다. 나는 이것을 위해 이것을 할 수있는 몇 가지 외부 라이브러리가 있다는 것을 알고 있습니다. 그러나 PHP에 관한 두 가지 질문이 있습니다. 1) PHP에서 SVD를 코딩하는 것이 가능하고 합리적이라고 생각하십니까? 2) 경우 (1) 예 : PHP로 코딩하도록 도와 줄 수 있습니까?

나는 이미 SVD의 일부를 혼자 코딩했습니다. 코드는 다음과 같습니다 이 코드의 일부 부분은 완전히 정확하지 않습니다.

당신이 나를 도울 수 있다면 좋을 것입니다. 미리 감사드립니다!

도움이 되었습니까?

해결책

SVD-Python은 SVD의 매우 명확하고 파시적인 구현입니다. 그것은 실제로 pysuedocode이며 Python을 많이 모르더라도 PHP 구현을 이해하고 비교/그리기가 쉽게 쉽게 비교해야합니다.

SVD-Python

다른 사람들이 언급했듯이, 나는 PHP 구현을 통해 매우 무거운 LSA를 할 수 없을 것이라고 기대하지 않을 것입니다.

건배

편집 : 위의 모듈은 그 자체로는 아무것도하지 않지만 오프닝 주석에 포함 된 예가 있습니다. Python 모듈을 다운로드하고 액세스 할 수 있다고 가정하면 (예 : 동일한 폴더에서) 다음과 같이 사소한 예를 구현할 수 있습니다.

#!/usr/bin/python
import svd
import math

a = [[22.,10., 2.,  3., 7.],
     [14., 7.,10.,  0., 8.],
     [-1.,13.,-1.,-11., 3.],
     [-3.,-2.,13., -2., 4.],
     [ 9., 8., 1., -2., 4.],
     [ 9., 1.,-7.,  5.,-1.],
     [ 2.,-6., 6.,  5., 1.],
     [ 4., 5., 0., -2., 2.]]

u,w,vt = svd.svd(a)
print w

여기에 'w'에는 단일 값 목록이 포함되어 있습니다.
물론 이것은 잠재적 인 시맨틱 분석과 그 친척의 길에 참여합니다. 일반적으로 단수 값의 수를 줄인 다음 적절한 거리 메트릭을 사용하여 문서, 단어, 문서 및 단어 등의 유사성을 측정하려고합니다. 결과 벡터 사이의 각도의 코사인은 매우 인기가 있습니다.

잠재 시맨틱 매핑 (PDF)

SVD에 따라 운동하는 데 필요한 나머지 단계에서 읽은 가장 명확하고 가장 간결하며 유익한 논문입니다.

EDIT2 : 또한 매우 큰 용어 문서 매트릭스로 작업하는 경우 (이것이 당신이하고있는 일이라고 가정하고 있음) 오프라인 모드에서 분해를 수행하는 것이 훨씬 더 효율적일 것입니다. 요청에 대한 응답으로 라이브 방식으로 비교 만 수행하십시오. SVD-Python은 학습에 적합하지만 SVDLIBC는 그러한 무거운 계산에 대해 원하는 것이 더 많습니다.

마지막으로 위의 Bellegarda 논문에서 언급했듯이 새 문서 나 요청을받을 때마다 SVD를 다시 사용하지 않아도됩니다. 당신이하려는 일에 따라 오프라인 모드, 로컬 머신에서 매주 한 번씩 SVD를 수행 한 다음 결과를 업로드 할 수 있습니다 (크기/대역폭 문제에도 불구하고).

어쨌든 행운을 빕니다!

다른 팁

"나는 시간 제한이 무엇인지 상관하지 않는다"고 말할 때 조심하십시오. SVD는 an입니다 O(N^3) 작동 (또는 O(MN^2) 직사각형 인 경우 m*n 매트릭스) 이는 문제가 오랜 시간이 걸릴 수있는 상황에 처할 수 있음을 의미합니다. 100*100 케이스가 1 분이 걸리면 1000*1000 케이스는 10^3 분 또는 거의 17 시간 (그리고 아마도 캐시가 없을 가능성이 높기 때문에 현실적으로 더 나쁘다). PHP, Prefactor와 같은 것 - 숫자는 N^3 필요한 플롭 카운트를 계산하기 위해 매우 클 수 있습니다.

물론 PHP로 코딩 할 수 있다고 말하면서 언어에는 필요한 데이터 구조와 작업이 있습니다.

나는 이것이 오래된 Q라는 것을 알고 있지만 여기 내 2 비트가 있습니다.

1) 진정한 SVD는 Netflix 상에서 사용 된 미적분학에서 영감을 얻은 근사치보다 훨씬 느립니다. 보다: http://www.sifter.org/~simon/journal/20061211.html

여기에는 구현 (C)이 있습니다.http://www.timelydevelopment.com/demos/netflixprize.aspx

2) C는 더 빠르지 만 PHP는 확실히 할 수 있습니다.

PHP Architect 저자 Cal Evans : "PHP는 웹 스크립팅 언어입니다 ... [그러나] PHP는 배치 파일이나 쉘 스크립트와 동등한 DOS를 작성하는 스크립팅 언어로 사용했습니다. PHP 내에서 수행해야 할 일은 PHP-GTK 프로젝트 인 PHP를 통해 데스크탑 애플리케이션을 구축 할 수있는 프로젝트도 있습니다. "

질문 1 : 확실히 가능합니다. 합리적인 지 여부는 시나리오에 달려 있습니다. 매트릭스는 얼마나 큰가요? 코드를 얼마나 자주 실행하려고합니까? 웹 사이트 또는 명령 줄에서 실행됩니까? 속도에 신경 쓰면 제안하겠습니다 간단한 확장을 작성합니다 전화를 랩합니다 GNU 과학 도서관.

그렇습니다. PHP에서 SVD를 구현하는 것은 최적의 접근 방식이 아닙니다. 여기에서 볼 수 있듯이 PHP는 C보다 느리고 C ++보다 느리기 때문에이 언어 중 하나에서 수행 할 수 있고 결과를 얻기위한 기능으로 호출 할 수있는 것이 더 좋았을 것입니다. 알고리즘 구현을 찾을 수 있습니다 여기, 당신은 그것을 트로프로 안내 할 수 있습니다.

호출 기능은 사용할 수 있습니다.

  • exec () 함수

시스템 기능은 매우 유용하고 강력하지만 가장 큰 문제 중 하나는 프로그램의 모든 결과 텍스트가 출력 스트림으로 직접 사용된다는 것입니다. 결과 텍스트를 포맷하고 다른 방식으로 표시하거나 전혀 표시하지 않는 상황이 있습니다.

  • 시스템 () 함수

PHP의 시스템 함수는 실행하라는 명령과 함께 문자열 인수와 해당 명령에 전달한 인수를 취합니다. 이 함수는 지정된 명령을 실행하고 결과 텍스트를 출력 스트림 (웹 서버 상황의 HTTP 출력 또는 명령 줄 도구로 PHP를 실행중인 경우 콘솔)에 덤프합니다. 이 기능의 반환은 텍스트 출력을 방출하는 경우 프로그램의 마지막 출력 라인입니다.

  • passthru () 함수

PHP가 우리가 지금까지 본 것과 유사한 기능을 제공하는 한 가지 매혹적인 기능은 패스 스루 기능입니다. 이 기능은 다른 기능과 마찬가지로 귀하가 말한 프로그램을 실행합니다. 그러나이 프로그램의 원시 출력을 PHP가 현재 작동하는 출력 스트림 (즉, 웹 서버 시나리오에서 HTTP 또는 PHP의 명령 행 버전의 쉘)으로 즉시 보냅니다.

  1. 예. 이것은 PHP에서 구현 될 수 있습니다. 실행을위한 합리적인 기간이 무엇인지, 얼마나 큰 계산할 수 있는지 모르겠습니다. 나는 아마도 아이디어를 얻기 위해 알고리즘을 구현해야 할 것입니다.

  2. 예, 코드를 도와 드릴 수 있습니다. 하지만 왜 도움이 필요합니까? 당신이 쓴 코드가 작동하지 않습니까?

따로 질문처럼. 어떤 버전의 PHP를 사용하십니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top