Question

Je voudrais mettre en œuvre Singular Value Decomposition (SVD) en PHP. Je sais qu'il ya plusieurs bibliothèques externes qui pourraient le faire pour moi. Mais j'ai deux questions concernant PHP, bien que: 1) Pensez-vous qu'il est possible et / ou raisonnable pour coder la SVD en PHP? 2) Si (1) est oui: Pouvez-vous me aider à coder en PHP

?

Je l'ai déjà codé certaines parties de SVD par moi-même. Voici le de code que je fait des commentaires au cours de l'action en. Certaines parties de ce code ne sont pas tout à fait correct.

Il serait génial si vous pouviez me aider. Merci beaucoup à l'avance!

Était-ce utile?

La solution

SVD-python Est-ce une mise en œuvre très claire, parcimonieuse du SVD. Il est pratiquement psuedocode et devrait être assez facile à comprendre et comparer / tirer parti de la mise en œuvre pour votre php, même si vous ne savez pas python beaucoup.

SVD-python

Cela dit, comme d'autres l'ont mentionné, je ne pense pouvoir faire très lourds LSA avec php ce qui ressemble à la mise en œuvre d'un web-hôte assez limité.

Vive

Edit:   Le module ne fait pas au-dessus de quoi que ce soit par lui-même, mais il est un exemple inclus dans le l'ouverture des commentaires. En supposant que vous avez téléchargé le module python, et il était accessible (par exemple dans le même dossier), vous pourrait mettre en œuvre un exemple trivial que suivre,

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

Ici « w » contient votre liste de valeurs singulières.
Bien sûr, cela ne vous obtient une partie de la façon de l'analyse sémantique latente et ses parents. Vous voulez généralement de réduire le nombre de valeurs singulières, puis utiliser une distance appropriée métrique pour mesurer la similarité entre vos documents, ou des mots ou des documents et des mots, etc. Le cosinus de l'angle entre vos vecteurs résultants est assez populaire.

sémantique latente Mapping (pdf)

est de loin la plus claire, le papier le plus concis et informatif, je l'ai lu sur les étapes restantes vous besoin de travailler à la suite du SVD.

Edit2: Notez également que si vous travaillez avec de très grandes matrices terme-documents (je suppose que ce est ce que vous faites), il est presque certainement va être beaucoup plus efficace pour effectuer la décomposition dans un mode hors connexion, puis effectuer que les comparaisons d'une façon direct en réponse aux demandes. tandis que SVD-python est idéal pour l'apprentissage, l'svdlibc est plus ce que vous voulez pour un tel lourd calcul.

enfin, comme mentionné dans le document de bellegarda ci-dessus, rappelez-vous que vous n'avez pas à recalculer la SVD à chaque fois que vous obtenez un nouveau document ou demande. en fonction de ce que vous essayez de faire vous pourriez probablement avec l'exécution du SVD une fois par semaine ou, en mode hors-ligne, une machine locale, et puis télécharger les résultats (taille / problèmes de bande passante malgré).

de toute façon bonne chance!

Autres conseils

Soyez prudent lorsque vous dites: « Je ne me soucie pas de ce que les délais sont ». SVD est une opération de O(N^3) (ou O(MN^2) si elle est une matrice rectangulaire m*n) ce qui signifie que vous pourriez très facilement dans une situation où votre problème peut prendre très longtemps. Si le 100 * 100 cas prend une minute, le 1000 * 1000 cas serait 10 ^ 3 minutes, ou près de 17 heures (et probablement pire, de façon réaliste, que vous êtes susceptible d'être hors de cache). Avec quelque chose comme PHP, le préfacteur -. Le nombre multipliant le N^3 afin de calculer le nombre de FLOP nécessaire, pourrait être très, très grand

Cela dit, bien sûr, il est possible de le coder en PHP - la langue dispose des structures de données nécessaires et les opérations.

Je sais que c'est un vieux Q, mais voici mes 2 bits:

1) A vrai SVD est beaucoup plus lente que les approximations inspiré calcul utilisées, par exemple dans le prix Netflix. Voir: http://www.sifter.org/~simon/journal/20061211.html

Il y a une mise en œuvre (en C) ici: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C serait plus rapide mais PHP peut certainement le faire.

auteur Architecte PHP Cal Evans: « PHP est un langage de script web ... [mais] Je l'ai utilisé PHP comme langage de script pour écrire l'équivalent DOS de fichiers par lots ou l'équivalent Linux de scripts shell, je l'ai. a constaté que la plupart de ce que je dois faire peut être accompli à partir de PHP. Il y a même un projet pour vous permettre de créer des applications de bureau via PHP, le projet PHP-GTK. "

En ce qui concerne la question 1: Il est certainement possible. Que ce soit raisonnable dépend de votre scénario: Quelle est la taille de vos matrices? Combien de fois avez-vous l'intention d'exécuter le code? Est-il fonctionner dans un site Web ou à partir de la ligne de commande? Si vous faites attention sur la vitesse, je suggère écrire une simple extension qui enveloppe appelle à la GNU Scientific Library .

Oui, il est posible, mais la mise en œuvre SVD en php ins't l'approche optimale. Comme vous pouvez le voir ici PHP est plus lent que C et aussi plus lent que C ++, alors peut-être qu'il valait mieux si vous pouvez le faire dans l'une de ces langues et de les appeler en fonction pour obtenir vos résultats. Vous pouvez trouver une implémentation de l'algorithme , de sorte que vous peut guider vous Trough il.

A propos de l'appel de fonction peut utiliser:

  • La fonction exec ()

La fonction du système est très utile et puissant, mais l'un des plus gros problèmes avec c'est que tout le texte résultant du programme passe directement au flux de sortie. Il y aura des situations où vous aimeriez mettre en forme le texte résultant et afficher d'une manière différente, ou ne pas l'afficher du tout.

  • Le système () Fonction

La fonction du système en PHP prend un argument de chaîne avec la commande à exécuter ainsi que tous les arguments que vous souhaitez avoir passé à cette commande. Cette fonction exécute la commande spécifiée et dépotoirs tout texte résultant du flux de sortie (soit la sortie HTTP dans une situation de serveur Web ou la console si vous utilisez PHP comme outil de ligne de commande). Le retour de cette fonction est la dernière ligne de sortie du programme, si elle émet la sortie de texte.

  • Le passthru () Fonction

Une fonction fascinante que PHP offre semblable à ceux que nous avons vu jusqu'à présent est la fonction de relais. Cette fonction, comme les autres, exécute le programme que vous lui dites. Cependant, il procède alors d'envoyer immédiatement la sortie brute de ce programme au flux de sortie avec lequel PHP travaille actuellement (à savoir le protocole HTTP dans un scénario de serveur web, ou la coquille dans une version en ligne de commande de PHP).

  1. Oui. cela est parfaitement possible d'être mis en œuvre en PHP. Je ne sais pas ce que le délai raisonnable pour l'exécution et la taille, il peut calculer. Je devrais probablement mettre en oeuvre l'algorithme pour obtenir une idée rought.

  2. Oui, je peux vous aider à coder. Mais pourquoi avez-vous besoin d'aide? Ne pas le code que vous avez écrit le travail?

Tout comme une question à part. Quelle version de PHP utilisez-vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top