Decomposição de valor singular (SVD) em PHP

Gostaria de implementar Decomposição de Valor Singular (SVD) em PHP. Eu sei que existem várias bibliotecas externas que podem fazer isso para mim. Mas eu tenho duas perguntas sobre o PHP, porém: 1) Você acha que é possível e / ou razoável codificar o SVD em PHP? 2) Se (1) for sim: Você pode me ajudar a codificá-lo em PHP?

Eu já codifiquei algumas partes da SVD sozinho. Aqui está o código em que fiz comentários para o curso de ação. Algumas partes deste código não estão completamente corretas.

Seria ótimo se você pudesse me ajudar. Muito obrigado antecipadamente!

SVD-python É uma implementação muito clara e parcimoniosa da SVD. É praticamente psuedocode e deve ser bastante fácil de entender e comparar / desenhar sobre a sua implementação de php, mesmo se você não conhece muito Python.

SVD-python

Dito isto, como outros já mencionaram, não esperaria poder fazer LSA muito pesado com a implementação do PHP, o que parece ser um web-host bastante limitado.

Felicidades

Editar: O módulo acima não faz nada por si só, mas há um exemplo incluído nos comentários iniciais. Supondo que você tenha baixado o módulo python, e ele foi acessado (por exemplo, na mesma pasta), você poderia implementar um exemplo trivial como se segue,

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

Aqui ‘w’ contém sua lista de valores singulares.
Claro que isso só faz você parte do caminho para a análise semântica latente e seus parentes. Você geralmente quer reduzir o número de valores singulares e, em seguida, empregar uma métrica de distância apropriada para medir a semelhança entre seus documentos, palavras ou documentos e palavras, etc. O coseno do ângulo entre seus vetores resultantes é bastante popular.

Mapeamento semântico latente (pdf)

é, de longe, o documento mais claro, mais conciso e informativo que eu li nas etapas restantes que você precisa para trabalhar após a SVD.

Edit2: note também que, se você estiver trabalhando com matrizes de documentos de termo muito grandes (suponho que é isso que você está fazendo), quase certamente será muito mais eficiente executar a decomposição em um modo off-line e, em seguida, realize apenas as comparações de uma forma ao vivo em resposta a solicitações. Enquanto o svd-python é ótimo para aprender, o svdlibc é mais o que você deseja para uma computação tão pesada.

Finalmente, como mencionado no artigo bellegarda acima, lembre-se de que você não precisa recalcular o svd toda vez que você receber um novo documento ou pedido. Dependendo do que você está tentando fazer, você provavelmente pode fugir com a execução do svd uma vez por semana ou mais, em um modo off-line, uma máquina local e, em seguida, carregar os resultados (não obstante o tamanho / a largura de banda se preocupa).

de qualquer forma, boa sorte!

Tenha cuidado ao dizer “Não me importo com os limites de tempo”. SVD é uma operação O(N^3) (ou O(MN^2) se for uma matriz m*n retangular), o que significa que você poderia muito facilmente estar em uma situação em que seu problema pode levar muito tempo. Se o caso de 100 * 100 demorar um minuto, o caso de 1000 * 1000 seria de 10 a 3 minutos, ou quase 17 horas (e provavelmente pior, de maneira realista, pois é provável que você esteja fora do cache). Com algo como PHP, o prefactor – o número que multiplica o N^3 para calcular a contagem FLOP necessária, pode ser muito, muito grande.

Dito isso, é claro que é possível codificá-lo em PHP – o idioma possui as estruturas e operações de dados necessárias.

Em relação à questão 1: definitivamente é possível. Se é razoável depende do seu cenário: quão grande são as suas matrizes? Com que frequência você pretende executar o código? É executado em um site ou a partir da linha de comando? Se você se preocupa com a velocidade, eu sugiro escrever uma extensão simples que envolve chamadas para a GNU Scientific Library .

Eu sei que isso é um Q antigo, mas aqui estão meus 2 bits:

1) Uma SVD verdadeira é muito mais lenta do que as aproximações inspiradas em cálculos usadas, por exemplo, no prêmio Netflix. Veja: http://www.sifter.org/~simon/journal/20061211.html

Há uma implementação (em C) aqui: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C seria mais rápido, mas o PHP certamente pode fazê-lo.

Autor do Arquiteto PHP Cal Evans: “O PHP é uma linguagem de script da web … [mas] usei o PHP como uma linguagem de script para escrever o equivalente do DOS dos arquivos BATCH ou o equivalente ao Linux dos scripts shell. Achei que a maioria do que eu preciso fazer pode ser realizado a partir do PHP. Existe mesmo um projeto que permite que você crie aplicativos de desktop via PHP, o projeto PHP-GTK “.

Sim, é possível, mas implementar SVD na php ins’t a abordagem ótima. Como você pode ver aqui, o PHP é mais lento do que C e também mais lento que o C ++, então talvez seja melhor se você pudesse fazê-lo em um desses idiomas e chamá-los como uma function para obter seus resultados. Você pode encontrar uma implementação do algoritmo aqui , para que você possa se guiar por isso.

Sobre a function chamada pode usar:

  • A function exec ()

A function do sistema é bastante útil e poderosa, mas um dos maiores problemas com isso é que todo o texto resultante do programa vai diretamente ao stream de saída. Haverá situações em que você gostaria de formatar o texto resultante e exibi-lo de maneira diferente, ou não exibi-lo.

  • O sistema () Função

A function do sistema em PHP leva um argumento de string com o comando para executar, assim como qualquer argumento que você deseja passar para esse comando. Esta function executa o comando especificado e descarrega qualquer texto resultante para o stream de saída (seja a saída HTTP em uma situação do servidor web, ou o console se você estiver executando o PHP como uma ferramenta de linha de comando). O retorno desta function é a última linha de saída do programa, se ele emitir saída de texto.

  • A function passthru ()

Uma function fascinante que o PHP oferece semelhante à que vimos até agora é a function passthru. Esta function, como as outras, executa o programa ao qual você diz. No entanto, ele passa a enviar imediatamente a saída bruta deste programa para o stream de saída com o qual o PHP está funcionando atualmente (ou seja, HTTP em um cenário de servidor web, ou o shell em uma versão de linha de comando de PHP).

  1. Sim. Isso é perfeitamente possível ser implementado em PHP. Não sei qual é o prazo razoável para a execução e o tamanho que pode calcular. Eu provavelmente teria que implementar o algoritmo para obter uma ideia.

  2. Sim, posso ajudá-lo a codificá-lo. Mas por que você precisa de ajuda? O código que você escreveu não funciona?

Assim como uma questão à parte. Qual versão do PHP você usa?