Domanda

Vorrei implementare Singular Value Decomposition (SVD) in PHP. So che ci sono diverse librerie esterni che possono fare questo per me. Ma ho due domande riguardanti PHP, però: 1) Pensi che sia possibile e / o ragionevole codificare lo SVD in PHP? 2) Se (1) è sì: Mi potete aiutare al codice in PHP

?

Ho già codificato alcune parti della SVD da solo. Ecco il codice che ho fatto commenti alla linea di condotta in. Alcune parti di questo codice non sono del tutto corrette.

Sarebbe bello se potesse aiutare. Grazie mille in anticipo!

È stato utile?

Soluzione

SVD-python E 'molto chiara, parsimoniosa attuazione della SVD. E 'praticamente psuedocodarlo e dovrebbe essere abbastanza facile da capire e confrontare / attingere per la realizzazione di PHP, anche se non si sa molto python.

SVD-python

Detto questo, come altri hanno detto che non ci si aspetterebbe di essere in grado di fare LSA molto pesanti con implementazione php quello che suona come un web-host piuttosto limitata.

Saluti

Modifica:   Il modulo di cui sopra non fa nulla da sola, ma v'è un esempio incluso nel apertura commenti. Dando per scontato che hai scaricato il modulo python, ed era accessibile (per esempio nella stessa cartella), si potrebbe implementare un esempio banale come seguono,

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

Qui 'w' contiene l'elenco dei valori singolari.
Naturalmente questo diventa solo una parte del modo di analisi semantica latente e dei suoi parenti voi. Di solito si vuole ridurre il numero di valori singolari, quindi impiegare una certa distanza appropriata metrica per misurare la somiglianza tra i documenti, o parole, o documenti e parole, etc. Il coseno dell'angolo tra i vettori che ne risulta è piuttosto popolare.

Latent Semantic Mapping (pdf)

è di gran lunga il giornale più chiaro, più conciso e informativo che ho letto sui restanti passi che bisogno di lavorare in seguito alla SVD.

Edit2: Si noti inoltre che se si sta lavorando con molto grandi matrici termine-documento (sto assumendo questo è quello che state facendo) si tratta quasi certamente sarà molto più efficiente per eseguire la decomposizione in modalità offline, e quindi eseguire solo i confronti in un modo vivo in risposta alle richieste. mentre SVD-python è grande per l'apprendimento, la svdlibc è più quello che si vorrebbe per così pesante calcolo.

, infine, come indicato nel documento bellegarda sopra, ricordate che non c'è bisogno di ricalcolare la svd ogni volta che si ottiene un nuovo documento o richiesta. a seconda di ciò che si sta cercando di fare si potrebbe probabilmente ottenere via con l'esecuzione del SVD una volta ogni settimana o giù di lì, in modalità non in linea, un computer locale, e quindi caricare i risultati (Volume / preoccupazioni banda nonostante).

in ogni caso in bocca al lupo!

Altri suggerimenti

Fare attenzione quando si dice "Non mi importa quali sono i limiti di tempo sono". SVD è un'operazione O(N^3) (o O(MN^2) se si tratta di una matrice m*n rettangolare) il che significa che si potrebbe essere molto facilmente in una situazione in cui il problema può richiedere molto tempo. Se il caso di 100 * 100 prende un minuto, il caso 1000 * 1000 avrebbe 10 ^ 3 minuti, o quasi 17 ore (e probabilmente peggiore, realisticamente, come è molto probabile che essere fuori di cache). Con qualcosa come PHP, il prefactor -. Il numero moltiplicando il N^3 al fine di calcolare il numero di FLOP necessaria, potrebbe essere molto, molto grande

Detto questo, naturalmente è possibile codificare in PHP - la lingua ha le strutture di dati richiesti e le operazioni.

So che questo è un vecchio Q, ma ecco il mio 2-bit:

1) Un vero SVD è molto più lento rispetto alle approssimazioni di calcolo di ispirazione utilizzati, ad esempio, al Premio Netflix. Vedere: http://www.sifter.org/~simon/journal/20061211.html

C'è un'implementazione (in C) qui: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C sarebbe più veloce, ma PHP può certamente farlo.

PHP Architect autore Cal Evans: "PHP è un linguaggio di scripting web ... [ma] ho usato PHP come linguaggio di scripting per la scrittura l'equivalente DOS del file batch o l'equivalente Linux di script di shell ho. ha scoperto che la maggior parte di quello che ho bisogno di fare può essere realizzato all'interno di PHP. C'è anche un progetto per consentire di creare applicazioni desktop tramite PHP, il progetto PHP-GTK ".

Riguardo la domanda 1: E 'sicuramente possibile. Che si tratti di ragionevole dipende dal vostro scenario: Quanto sono grandi i tuoi matrici? Come spesso si intende eseguire il codice? E 'eseguito in un sito web o dalla riga di comando? Se fate attenzione sulla velocità, vorrei suggerire scrivendo una semplice estensione che ricopre chiamate al GNU Scientific Library .

Sì, è posible, ma attuare SVD in php ins't l'approccio ottimale. Come potete vedere qui PHP è più lento di C e anche più lento di C ++, quindi magari era meglio se si potesse fare in una di queste lingue e li chiamano come una funzione per ottenere i risultati. È possibile trovare un'implementazione dell'algoritmo qui , in modo da può guidare da soli attraverso essa.

A proposito della funzione chiamante può utilizzare:

  • L'exec () Funzione

La funzione di sistema è molto utile e potente, ma uno dei più grandi problemi con esso è che tutto il testo risultante dal programma va direttamente nel flusso di output. Ci saranno situazioni in cui, come si potrebbe formattare il testo risultante e visualizzarlo in un modo diverso, o non visualizzare affatto.

  • Il sistema () Funzione

La funzione di sistema in PHP prende un argomento di tipo stringa con il comando da eseguire, nonché tutti gli argomenti che si desidera passato a quel comando. Questa funzione esegue il comando specificato, e copia di qualsiasi testo risultante per il flusso di output (sia l'output HTTP in una situazione di web server, o la console se si esegue PHP come uno strumento a riga di comando). Il ritorno di questa funzione è l'ultima linea di uscita dal programma, se emette output di testo.

  • Il passthru () Funzione

Una funzione affascinante che PHP fornisce simili a quelle che abbiamo visto finora è la funzione passante. Questa funzione, come gli altri, esegue il programma che si è detto di. Tuttavia, esso procede quindi a trasmettere immediatamente all'uscita greggio da questo programma per il flusso di output con cui PHP sta lavorando (cioè o HTTP in uno scenario di server web, o il guscio in una versione a linea di comando di PHP).

  1. Sì. questo è perfettamente possibile attuare in PHP. Io non so quale sia la ragionevole lasso di tempo per l'esecuzione e quanto grande si può calcolare. Io probabilmente dovuto implementare l'algoritmo per avere un'idea rought.

  2. Si posso aiutarti a codificarlo. Ma perché hai bisogno di aiuto? Non il codice che ha scritto il lavoro?

Proprio come una digressione domanda. Quale versione di PHP si usa?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top