Frage

Ich möchte Einzelwertzerlegung (SVD) in PHP implementieren. Ich weiß, dass es mehrere externe Bibliotheken, die dies für mich tun könnte. Aber ich habe zwei Fragen PHP über, aber: 1) Halten Sie es für möglich und / oder zumutbar wäre, die SVD in PHP zu codieren? 2) Wenn (1) ja: Können Sie mir helfen, es zu codieren, in PHP

?

Ich habe schon einige Teile SVD von mir codiert. Hier ist der Code die ich Kommentare in dem Verlauf der Aktion gemacht. Einige Teile dieser Codes ist nicht ganz korrekt.

Es wäre toll, wenn ihr mir helfen könntet. Vielen Dank im Voraus!

War es hilfreich?

Lösung

SVD-python Ist eine sehr klare, parsimonious Umsetzung des SVD. Es ist praktisch psuedocode und sollte recht einfach zu verstehen und vergleichen Sie / ziehen auf für Ihre PHP-Implementierung, auch wenn Sie nicht wissen viel Python.

SVD-Python

Wie gesagt, wie andere erwähnt haben würde ich nicht erwarten zu können, LSA tun, sehr schwere mit PHP-Implementierung, was wie eine ziemlich begrenzte Web-Host klingt.

Prost

Edit:   Das Modul oben tut nichts ganz von selbst, aber es ist ein Beispiel in der mitgelieferten Öffnen Kommentare. Vorausgesetzt, dass Sie den Python-Modul heruntergeladen hat, und es war zugänglich (zum Beispiel in dem gleichen Ordner), Sie könnte ein triviales Beispiel implementieren, wie folgt,

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

Hier ‚w‘ enthält die Liste der Einzelwerte.
Natürlich wird dies nur Sie einen Teil des Weges semantische Analyse und seine Verwandte latent. Sie wollen in der Regel die Anzahl der Einzelwerte zu reduzieren, verwenden dann eine entsprechende Distanz Metrik, um die Ähnlichkeit zwischen Dokumenten oder Wörter, oder Dokumente und Worte zu messen, usw. Der Kosinus des Winkels zwischen den resultierenden Vektoren ist ziemlich beliebt.

Latent Semantic Mapping (pdf)

ist bei weitem das klarste, prägnant und informativ Papier, das ich auf die verbleibenden Schritte gelesen haben Sie muß nach dem SVD arbeiten.

Edit2: auch beachten, dass, wenn Sie mit sehr großen Begriff-Dokument-Matrizen arbeiten (ich gehe mal davon aus der ist das, was Sie tun) es geht mit ziemlicher Sicherheit ist wesentlich effizienter, um die Zersetzung durchzuführen in einem Offline-Modus, und führen Sie dann nur die Vergleiche in einer Live-Mode in Reaktion auf Anfragen. während SVD-Python groß für das Lernen ist, ist die svdlibc mehr, was Sie für eine solche schwere wollen würde Berechnung.

schließlich, wie oben in dem Papier erwähnt Bellegardas, denken Sie daran, dass Sie das nicht neu berechnen müssen SVD jedes einzelne Mal, wenn Sie ein neues Dokument oder Anfrage erhalten. je nachdem, was Sie versuchen, Sie könnten zu tun wahrscheinlich weg mit dem SVD einmal Durchführung jede Woche oder so, im Offline-Modus, eine lokale Maschine, und die Ergebnisse dann das Hochladen (Größe / Bandbreite betrifft ungeachtet).

sowieso viel Glück!

Andere Tipps

Seien Sie vorsichtig, wenn Sie sagen: „Ich kümmere mich nicht, was die Fristen sind“. SVD ist ein O(N^3) Betrieb (oder O(MN^2) wenn es sich um eine rechteckige m*n Matrix ist), was bedeutet, dass man sehr leicht in einer Situation sein könnte, wo Ihr Problem eine sehr lange Zeit in Anspruch nehmen kann. Wenn der 100 * 100 Fall dauert eine Minute, die 1000 * 1000 Fall würde 10 ^ 3 Minuten oder fast 17 Stunden (und wahrscheinlich noch schlimmer, realistisch gesehen, wie Sie wahrscheinlich aus dem Cache sein). Mit so etwas wie PHP, die Vorfaktor -. Die Zahl Multiplikation der N^3, um die erforderlichen FLOP Zahl zu berechnen, könnte sehr, sehr groß

Having said that, ist es natürlich möglich, es in PHP-Code - die Sprache hat die erforderlichen Datenstrukturen und Operationen.

Ich weiß, das ist ein alter Q, aber hier sind meine 2-Bits:

1) Ein echter SVD ist viel langsamer als die Kalkül inspirierte Annäherungen verwendet, zum Beispiel in dem Netflix-Preis. Siehe: http://www.sifter.org/~simon/journal/20061211.html

Es gibt eine Implementierung (in C) hier: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C wäre schneller, aber PHP kann es auf jeden Fall tun.

PHP Architect Autor Cal Evans: „PHP ist eine Web-Skriptsprache ... [aber] ich habe für das Schreiben der DOS-Äquivalent von Batch-Dateien oder die Linux-Äquivalent von Shell-Skripten PHP als Skriptsprache verwendet, ich habe. festgestellt, dass das meiste, was ich tun muß, kann aus PHP erreicht werden. Es auch ein Projekt, das Sie Desktop-Anwendungen über PHP zu bauen, damit ist, Projekt des PHP-GTK. "

Zu Frage 1: Es ist definitiv möglich. Ob es sinnvoll ist abhängig von Ihrem Szenario: Wie groß sind Ihre Matrizen? Wie oft wollen Sie den Code auszuführen? Ist es in einer Web-Site oder von der Kommandozeile ausgeführt werden? Wenn Sie über die Geschwindigkeit interessieren sich, würde ich vorschlagen, eine einfache Erweiterung schreiben, Wraps Wissenschaftliche Bibliothek Anrufe an die GNU.

Ja, es ist posible, aber SVD in PHP-Implementierung ins't den optimalen Ansatz. Wie man hier sehen kann, ist PHP langsamer als C und auch langsamer als C ++, so vielleicht war es besser, wenn man es in einer dieser Sprachen tun könnte und sie als eine Funktion aufrufen, um Ihre Ergebnisse zu bekommen. Sie können eine Implementierung des Algorithmus finden hier , so dass Sie Führung kann sich es Trog.

Über die Funktion aufrufen können:

  • Die exec () Funktion

Die Systemfunktion ist sehr nützlich und leistungsfähig, aber eines der größten Probleme mit ihm ist, dass all resultierende Text aus dem Programm direkt mit dem Ausgangsstrom geht. Es gibt Situationen, in denen Ihnen den resultierenden Text zu formatieren vielleicht gefallen und es in irgendeiner anderen Weise angezeigt werden, oder es überhaupt nicht angezeigt werden soll.

  • Das System () Funktion

Die Systemfunktion in PHP nimmt ein String-Argument mit dem Befehl auch ausführen wie alle Argumente, die Sie zu diesem Befehl übergeben wollen. Diese Funktion führt den angegebenen Befehl aus und Dumps jeden resultierenden Textes in den Ausgabestrom (entweder die HTTP-Ausgabe in einer Web-Server Situation oder die Konsole, wenn Sie PHP als Befehlszeilenprogramm ausgeführt werden). Die Rückkehr dieser Funktion ist die letzte Zeile der Ausgabe aus dem Programm, wenn es Textausgabe emittiert.

  • Die passthru () Funktion

Eine faszinierende Funktion, die PHP ähnlich denen, bietet die wir bisher gesehen haben, ist die passthru Funktion. Diese Funktion, wie die anderen, führt das Programm Sie es zu erzählen. Aber es geht dann sofort die Rohausgangssignal aus diesem Programm in den Ausgabestream zu senden, mit denen PHP arbeitet derzeit (das heißt entweder HTTP in einem Web-Server-Szenario oder den Shell in einer Kommandozeilenversion von PHP).

  1. Ja. Dies ist durchaus möglich, in PHP implementiert werden. Ich weiß nicht, was der angemessene Zeitrahmen für die Ausführung und wie groß es berechnen kann. Ich würde wahrscheinlich um den Algorithmus zu implementieren eine rought Idee zu erhalten.

  2. Ja, ich kann Ihnen helfen, codieren. Aber warum Sie brauchen Hilfe? Hat nicht der Code, den Sie geschrieben Arbeit?

Wie Nebenbei bemerkt Frage. Welche Version von PHP verwenden Sie?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top