2009-06-06 7 views
9

Me gustaría implementar la descomposición de valores singulares (SVD) en PHP. Sé que hay varias bibliotecas externas que podrían hacer esto por mí. Pero tengo dos preguntas con respecto a PHP: 1) ¿Crees que es posible y/o razonable codificar el SVD en PHP? 2) Si (1) es sí: ¿me pueden ayudar a codificarlo en PHP?Descomposición de valores singulares (SVD) en PHP

Ya he codificado algunas partes de SVD por mí mismo. Here's the code en el que hice comentarios sobre el curso de acción. Algunas partes de este código no son del todo correctas.

Sería genial si pudiera ayudarme. ¡Muchas gracias por adelantado!

+3

Sus comentarios en alemán son muy útiles. ¿Por qué necesitas implementar un algoritmo tan complicado en PHP? –

+0

Si alguien necesita los comentarios en inglés, puedo traducirlos, por supuesto. Tengo que implementarlo en PHP ya que no puedo instalar bibliotecas externas en mi espacio web. – caw

+0

huele a tarea – VVS

Respuesta

9

SVD-python Es una implementación muy clara y parsimoniosa de la SVD. Es prácticamente psuedocode y debería ser bastante fácil de entender y comparar/dibujar para su implementación de php, incluso si no conoce mucho Python.

SVD-python

Dicho esto, como otros han mencionado que no me esperaba ser capaz de hacer LSA de alta resistencia con aplicación muy php lo que suena como una red huésped bastante limitada.

Saludos

Editar: El módulo anterior no hace nada por sí mismo, pero no es un ejemplo incluido en los comentarios de apertura. Suponiendo que se ha descargado el módulo de Python, y era accesible (por ejemplo, en la misma carpeta), que podría implementar un ejemplo trivial de la siguiente manera,

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

Aquí 'w' contiene su lista de valores singulares.
Por supuesto, esto solo te lleva a una parte del camino hacia el análisis semántico latente y sus parientes. Por lo general, desea reducir el número de valores singulares y luego emplear una distancia apropiada de para medir la similitud entre sus documentos, palabras, documentos, palabras, etc. El coseno del ángulo entre los vectores resultantes es bastante popular .

Latent Semantic Mapping (pdf)

es, con mucho, la más clara del papel, más concisa e informativa que he leído en los pasos restantes que necesidad de trabajar a cabo a raíz de la enfermedad vesicular porcina.

Edit2: también en cuenta que si se trabaja con matrices muy grandes término-documento (estoy suponiendo que esto es lo que está haciendo) que es casi seguro que va a ser mucho más eficiente para llevar a cabo la descomposición en un modo fuera de línea, y luego realizar solo las comparaciones en vivo en respuesta a las solicitudes. mientras que svd-python es ideal para aprender, el svdlibc es más de lo que usted desearía para cálculos tan pesados ​​ .

finalmente como se menciona en el documento de bellegarda anterior, recuerde que no tiene que recalcular el svd cada vez que recibe un nuevo documento o solicitud. Dependiendo de lo que esté tratando de hacer podría salirse con la realización del svd una vez cada semana más o menos, en un modo fuera de línea, una máquina local, y luego cargar los resultados (sin importar el tamaño/ancho de banda).

de todos modos buena suerte!

+0

Muchas gracias !!! :) Sería fantástico si esto funcionara en combinación con la función passthru() de PHP (thx ljyanes). Pero este script no da ningún resultado. ¿Que debo hacer? He comentado esto: http://paste.bradleygill.com/index.php?paste_id=10389 – caw

+0

He agregado más información, incluido un ejemplo de trabajo de los comentarios en el módulo de Python. – si28719e

+0

Gracias de nuevo por la edición. Tu código es exactamente lo que hice, ¿no es así? ;) Mira el sitio de pasta de código donde escribí el código. Creo que acabo de tomar el paquete equivocado. Solo descargué el archivo svd.py que vinculó arriba. ¿Debo cargar algo más también? – caw

2

En cuanto a la pregunta 1: Definitivamente es posible. Si es razonable depende de su escenario: ¿Qué tan grandes son sus matrices? ¿Con qué frecuencia tiene la intención de ejecutar el código? ¿Se ejecuta en un sitio web o desde la línea de comandos? Si te preocupa la velocidad, sugeriría writing a simple extension que envuelve las llamadas al GNU Scientific Library.

+0

Gracias por esta respuesta. Me gustaría ejecutarlo en un sitio web y el script debería ser llamado por un cronjob. No me importa mucho la velocidad. Sería suficiente si el script siempre hiciera el SVD para 1 solo texto. La gran matriz que siempre necesito también podría almacenarse en caché. Escribir una extensión para GNU Scientific Library es un problema porque no puedo instalar bibliotecas en mi espacio web a través de la línea de comandos. – caw

+0

Si tiene acceso de shell y puede instalar binarios y usar cron, probablemente debería pensar en escribir binarios independientes (probablemente vinculados estáticamente), no un script PHP. Incluso para el mismo algoritmo, esto será más eficiente con la CPU y la memoria. – drdaeman

0
  1. Sí. esto es perfectamente posible para implementarse en PHP. No sé cuál es el marco de tiempo razonable para la ejecución y qué tan grande puede calcular. Probablemente tendré que implementar el algoritmo para tener una buena idea.

  2. Sí, puedo ayudarte a codificarlo. Pero, ¿por qué necesitas ayuda? ¿No funciona el código que escribiste?

Simplemente como una pregunta aparte. ¿Qué versión de PHP usas?

+0

¡Muchas gracias! Mucha gente con la que he hablado me dijo que PHP es completamente inadecuado para SVD. No me importan los límites de tiempo, solo me gustaría implementarlo. Mi código no funciona, ya que no obtiene los valores propios. Probé algunos procedimientos de aproximación pero no funcionaron bien. Sería genial si pudieras ayudarme. Uso PHP 5. – caw

5

Tenga cuidado cuando diga "No me importan los límites de tiempo". SVD es una operación O(N^3) (o O(MN^2) si es una matriz rectangular m*n) lo que significa que podría estar muy fácilmente en una situación donde su problema puede llevar mucho tiempo. Si el caso 100 * 100 tarda un minuto, el caso 1000 * 1000 representaría 10^3 minutos, o casi 17 horas (y probablemente sea peor, de manera realista, ya que es probable que no tenga caché). Con algo como PHP, el prefactor - el número que multiplica N^3 para calcular el conteo FLOP requerido, podría ser muy, muy grande.

Habiendo dicho eso, por supuesto es posible codificarlo en PHP - el lenguaje tiene las estructuras de datos y operaciones requeridas.

+0

¡Muchas gracias por esto! Entonces piensas que es posible codificarlo con PHP, pero PHP no es muy adecuado, ¿verdad? – caw

+0

Bueno, PHP no es ideal para el álgebra lineal numérica, pero si puede hacer que funcione en su caso depende de los detalles. ¿Qué tan grandes son las matrices en las que lo ejecutarás? ¿Qué, exactamente, necesitas hacer? Es posible que desee consultar un libro como Numerical Recipes para obtener información sobre las implementaciones. –

+0

Me gustaría usar SVD para análisis semántico latente. Así que 100x100 no será suficiente para las matrices, serán enormes ... – caw

1

Sí, es posible, pero implementar SVD en php no es el enfoque óptimo. Como puede ver aquí, PHP es más lento que C y también más lento que C++, por lo que tal vez era mejor si pudiera hacerlo en uno de estos idiomas y llamarlos como una función para obtener sus resultados. Puede encontrar una implementación del algoritmo here, para que pueda guiarse a través de él.

Acerca de la función que llama puede utilizar:

  • El exec() Función

La función del sistema es muy útil y poderosa, pero uno de los mayores problemas con esto es que todo el texto resultante del programa va directamente a la secuencia de salida. Habrá situaciones en las que le gustaría formatear el texto resultante y mostrarlo de alguna manera diferente, o no mostrarlo en absoluto.

  • El sistema() Función

La función del sistema en PHP toma un argumento de cadena con el comando a ejecutar, así como los argumentos usted deseo pasados ​​a ese comando. Esta función ejecuta el comando especificado y vuelca cualquier texto resultante a la secuencia de salida (ya sea la salida HTTP en una situación de servidor web, o la consola si está ejecutando PHP como una herramienta de línea de comandos). El retorno de esta función es la última línea de salida del programa, si emite salida de texto.

  • El tránsito() Función

Una función fascinante que ofrece PHP similares a las que hemos visto hasta ahora es la función de tránsito. Esta función, al igual que las demás, ejecuta el programa que se le indique. Sin embargo, luego procede a enviar inmediatamente la salida sin procesar de este programa al flujo de salida con el que PHP está trabajando actualmente (es decir, HTTP en un escenario de servidor web o el shell en una versión de línea de comando de PHP).

+0

¡Muchas gracias! :) – caw

+0

Debe mencionar que ha copiado las descripciones de las funciones directamente de [ChipmunkNinja] (http://chipmunkninja.com/Program-Execution-in-PHP%[email protected]). – TachyonVortex

2

Sé que esto es un viejo Q, pero aquí está mi 2 bits:

1) Un verdadero SVD es mucho más lento que las aproximaciones de cálculo de inspiración utilizados, por ejemplo, en el premio Netflix. Ver: http://www.sifter.org/~simon/journal/20061211.html

Hay una aplicación (en C) aquí: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C sería más rápido, pero PHP sin duda puede hacerlo.

El autor de PHP Architect Cal Evans: "PHP es un lenguaje de scripts web ... [pero] he usado PHP como lenguaje de scripting para escribir el equivalente de DOS de archivos BATCH o el equivalente de Linux de scripts de shell. he descubierto que la mayor parte de lo que necesito hacer se puede lograr desde PHP. Incluso hay un proyecto que le permite crear aplicaciones de escritorio a través de PHP, el proyecto PHP-GTK ".

+0

¡Muchas gracias! Interesante información y enlaces. – caw

Cuestiones relacionadas