PHP Tekil değer ayrışımı (SVD)

5 Cevap php

I would like to implement Singular Value Decomposition (SVD) in PHP. I know that there are several external libraries which could do this for me. But I have two questions concerning PHP, though: 1) Do you think it's possible and/or reasonable to code the SVD in PHP? 2) If (1) is yes: Can you help me to code it in PHP?

Ben zaten kendim SVD bazı bölümlerini kodlu ettik. Here's the code ki ben bu kodun bazı parçaların içeri eylem ders yorumlarda tamamen doğru değil.

Bana yardımcı olabilir, çok iyi olurdu. Şimdiden çok teşekkür ederiz!

5 Cevap

SVD-python Is a very clear, parsimonious implementation of the SVD. It's practically psuedocode and should be fairly easy to understand and compare/draw on for your php implementation, even if you don't know much python.

SVD-python

Yani diğerleri ben oldukça sınırlı bir web barındırma gibi geliyor ne php uygulama ile çok ağır LSA yapabilmek için beklemek olmaz belirttiğim gibi, dedi.

Şerefe

Edit: The module above doesn't do anything all by itself, but there is an example included in the opening comments. Assuming you downloaded the python module, and it was accessible (e.g. in the same folder), you could implement a trivial example as follow,

#!/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

Here 'w' contains your list of singular values.
Of course this only gets you part of the way to latent semantic analysis and its relatives. You usually want to reduce the number of singular values, then employ some appropriate distance metric to measure the similarity between your documents, or words, or documents and words, etc. The cosine of the angle between your resultant vectors is pretty popular.

Latent Semantic Mapping (pdf)

is by far the clearest, most concise and informative paper I've read on the remaining steps you need to work out following the SVD.

Edit2: also note that if you're working with very large term-document matrices (I'm assuming this is what you are doing) it is almost certainly going to be far more efficient to perform the decomposition in an offline mode, and then perform only the comparisons in a live fashion in response to requests. while svd-python is great for learning, the svdlibc is more what you would want for such heavy computation.

finally as mentioned in the bellegarda paper above, remember that you don't have to recompute the svd every single time you get a new document or request. depending on what you are trying to do you could probably get away with performing the svd once every week or so, in an offline mode, a local machine, and then uploading the results (size/bandwidth concerns notwithstanding).

Yine de iyi şanslar!

"Ben zaman sınırları ne umurumda değil" derken dikkatli olun. SVD bir O(N^3) operasyon çok kolayca sorun alabilir bir durumda olabilir anlamına gelir (veya O(MN^2), bir dikdörtgen m*n matris ise) Çok uzun bir zaman. 100 * 100 vaka bir dakika sürerse, 1000 * 1000 vaka 10 ^ 3 dakika olur, ya da (eğer önbellek dışında olması olasıdır gibi gerçekçi ve belki de daha kötü,) neredeyse 17 saat. PHP, çarpanı gibi bir şey ile - Gerekli FLOP sayısını hesaplamak için N^3 çarparak sayı, çok, çok büyük olabilir.

Dil gerekli veri yapıları ve operasyonları vardır - elbette PHP ile kod mümkün, o söyledikten sonra.

Bu eski bir Q olduğunu biliyorum, ama burada benim 2-bit var:

1) Gerçek bir SVD Netflix ödül olarak, örneğin kullanılan matematiğe esinlenen yaklaşımlar, daha yavaştır. Bkz: http://www.sifter.org/~simon/journal/20061211.html

There's an implementation (in C) here: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C daha hızlı olurdu ama PHP kesinlikle bunu yapabilirsiniz.

PHP Mimar yazar Cal Evans:. "PHP bir betik dilidir ... [ama] ben toplu iş dosyaları veya kabuk komut dosyaları Linux eşdeğer DOS eşdeğer yazmak için bir betik dili olarak PHP kullanılan ettik buldum çoğu Yapmam gereken ne PHP içinde yapılabilir. Eğer PHP, PHP-GTK projesi ile masaüstü uygulamaları oluşturmak için izin bile bir proje var. "

Evet doktorunun, ama php SVD uygulanması uygun yaklaşım Inst. Burada gördüğünüz gibi PHP C daha yavaş ve aynı zamanda bu dillerden birinde yapmak ve sonuç almak için bir fonksiyonu olarak diyebiliriz eğer C + +, bu yüzden belki de daha iyi oldu daha yavaştır. Sen algoritması here bir uygulama bulabilirsiniz, bu yüzden bunu kendiniz çukur rehberlik eder.

Hakkında arama fonksiyonu kullanabilirsiniz:

  • Exec () Fonksiyonu

Sistem fonksiyonu oldukça kullanışlı ve güçlü, ama onunla büyük sorunlardan biri programdan ortaya çıkan metin çıktı akımına doğrudan gider. Eğer çıkan metin biçimlendirmek ve bazı farklı bir şekilde göstermek, ya da hiç görüntülemek isteyebilirsiniz durumlar olacaktır.

  • Sistemi () Fonksiyonu

PHP sistem işlevi yanı sıra bu komutla iletilen dilek herhangi argümanlar yürütmek için komutu ile bir string argüman alıyor. Bu fonksiyon belirtilen komutu çalıştırır, ve (bir komut satırı aracı olarak PHP'nin çalıştığı bir web sunucusu durumda HTTP çıktı, ya da konsol ya) çıkış akışı için herhangi bir sonuç metin döker. Bu metin çıktı yayar eğer bu işlevin dönüş, programdan çıktı son satırı.

  • Geçiş () Fonksiyonu

PHP şimdiye kadar gördüğümüz benzer sağlayan bir büyüleyici fonksiyonu Geçiş fonksiyonudur. Bu fonksiyon, diğerleri gibi, sen onu söyle programı çalıştırır. Ancak, daha sonra hemen PHP'nin (yani bir web sunucusu senaryosunda HTTP, ya da PHP bir komut satırı versiyonu kabuk ya) çalışmakta olduğu çıkış akışı bu programdan ham çıktı göndermek ilerler.

  1. Yes. this is perfectly possible to be implemented in PHP. I don't know what the reasonable time frame for execution and how large it can compute. I would probably have to implement the algorithm to get a rought idea.

  2. Evet bunu kod yardımcı olabilir. Ama neden yardıma ihtiyacınız var mı? Eğer iş kod yazdı değil mi?

Sadece bir kenara soru olarak. PHP hangi sürümü kullanıyorsunuz?