Разложение по сингулярным числам (SVD) в PHP - PullRequest
9 голосов
/ 06 июня 2009

Я хотел бы реализовать разложение по сингулярным числам (SVD) в PHP. Я знаю, что есть несколько внешних библиотек, которые могли бы сделать это для меня. Но у меня есть два вопроса относительно PHP: 1) Как вы думаете, возможно и / или разумно кодировать SVD в PHP? 2) Если (1) - да, можете ли вы помочь мне написать код на PHP?

Я уже сам кодировал некоторые части SVD. Вот код , в котором я комментировал ход действий. Некоторые части этого кода не совсем корректны.

Было бы здорово, если бы вы могли мне помочь. Заранее большое спасибо!

Ответы [ 6 ]

9 голосов
/ 15 июня 2009

SVD-питон Это очень четкая, экономная реализация SVD. Это практически psuedocode и должно быть довольно легко понять и сравнивайте / рисуйте для своей реализации php, даже если вы плохо знаете Python.

SVD-питон

Тем не менее, как уже упоминали другие, я не ожидал, что смогу сделать очень мощный LSA с реализацией php, что звучит как довольно ограниченный веб-хостинг.

Приветствия

Edit: Модуль выше ничего не делает сам по себе, но есть пример, включенный в вступительные комментарии. Предполагая, что вы загрузили модуль Python, и он был доступен (например, в той же папке), вы может реализовать тривиальный пример следующим образом:

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

Здесь 'w' содержит ваш список особых значений.
Конечно, это только дает вам часть пути к скрытому семантическому анализу и его родственникам. Обычно вы хотите уменьшить количество значений в единственном числе, а затем использовать подходящее расстояние метрика для измерения сходства между вашими документами или словами, или документами и словами и т. д. Косинус угла между вашими результирующими векторами довольно популярен.

Скрытое семантическое отображение (pdf)

- безусловно, самый ясный, самый краткий и информативный документ, который я прочитал на оставшихся шагах. нужно потренироваться по СВД.

Edit2: также обратите внимание, что если вы работаете с очень большими матрицами терминологических документов (я предполагаю, что это это то, что вы делаете) почти наверняка будет гораздо эффективнее выполнить разложение в автономном режиме, а затем выполнять только сравнения в режиме реального времени в ответ на запросы. в то время как SVD-Python отлично подходит для обучения, svdlibc больше, чем вы хотели бы для такого тяжелого вычисление.

наконец, как уже упоминалось в статье Беллегарда выше, помните, что вам не нужно пересчитывать SVD каждый раз, когда вы получаете новый документ или запрос. в зависимости от того, что вы пытаетесь сделать, вы могли бы возможно, вам не придется выполнять svd раз в неделю или около того, в автономном режиме, на локальной машине, и затем загрузите результаты (несмотря на размер / пропускную способность).

в любом случае удачи!

5 голосов
/ 14 июня 2009

Будьте осторожны, когда говорите: «Мне все равно, сколько времени». SVD - это операция O(N^3) (или O(MN^2), если это прямоугольная матрица m*n), что означает, что вы можете очень легко оказаться в ситуации, когда ваша проблема может занять очень много времени. Если для случая 100 * 100 требуется одна минута, для случая 1000 * 1000 будет 10 ^ 3 минуты, или почти 17 часов (и, возможно, хуже, реально, так как вы, скорее всего, не в кеше). С чем-то вроде PHP, префактор - число, умноженное на N^3 для вычисления требуемого количества FLOP, может быть очень, очень большим.

Сказав, что, конечно, можно кодировать его на PHP - язык имеет необходимые структуры данных и операции.

3 голосов
/ 07 июля 2013

Я знаю, что это старый вопрос, но вот мои 2 бита:

1) Истинный SVD намного медленнее, чем используемые в исчислении аппроксимации, например, в премии Netflix. Смотри: http://www.sifter.org/~simon/journal/20061211.html

Здесь есть реализация (в C): http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C будет быстрее, но PHP, безусловно, может это сделать.

Автор PHP Architect Кэл Эванс: «PHP - это язык веб-сценариев ... [но] Я использовал PHP в качестве языка сценариев для написания DOS-эквивалента файлов BATCH или Linux-эквивалента сценариев оболочки. обнаружил, что большую часть того, что мне нужно сделать, можно сделать из PHP. Существует даже проект, позволяющий создавать настольные приложения через PHP, проект PHP-GTK. "

2 голосов
/ 06 июня 2009

По вопросу 1: Это определенно возможно. Разумно ли это зависит от вашего сценария: насколько велики ваши матрицы? Как часто вы собираетесь запускать код? Это запускается на веб-сайте или из командной строки? Если вам небезразлична скорость, я бы предложил написать простое расширение , которое обернет вызовы в Научную библиотеку GNU .

1 голос
/ 15 июня 2009

Да, это возможно, но реализация SVD в php не является оптимальным подходом. Как вы можете видеть здесь, PHP медленнее, чем C, а также медленнее, чем C ++, поэтому, возможно, было бы лучше, если бы вы могли сделать это на одном из этих языков и вызывать их как функцию для получения ваших результатов. Вы можете найти реализацию алгоритма здесь , чтобы вы могли сами руководствоваться им.

О функции вызова можно использовать:

  • Функция exec ()

Системная функция довольно полезна и мощна, но одна из самых больших проблем с ней заключается в том, что весь полученный в результате текст из программы направляется непосредственно в выходной поток. В некоторых ситуациях вам может понадобиться отформатировать полученный текст и отобразить его каким-либо другим способом или не отобразить его вообще.

  • Система () Функция

Системная функция в PHP принимает строковый аргумент с командой для выполнения, а также любые аргументы, которые вы хотите передать этой команде. Эта функция выполняет указанную команду и выводит любой результирующий текст в выходной поток (либо вывод HTTP в ситуации веб-сервера, либо консоль, если вы используете PHP в качестве инструмента командной строки). Возвращение этой функции - последняя строка вывода программы, если она генерирует текстовый вывод.

  • Функция passthru ()

Одна замечательная функция, которую предоставляет PHP, похожая на те, что мы видели до сих пор, это функция passthru. Эта функция, как и другие, выполняет программу, которую вы ей сообщаете. Однако затем он сразу же отправляет необработанный вывод из этой программы в поток вывода, с которым в данный момент работает PHP (т. Е. Либо HTTP в сценарии веб-сервера, либо оболочка в версии PHP командной строки).

0 голосов
/ 12 июня 2009
  1. Да. это вполне возможно реализовать в PHP. Я не знаю, какой разумный период времени для выполнения и насколько большой это может вычислить. Мне, вероятно, придется реализовать алгоритм, чтобы получить четкое представление.

  2. Да, я могу помочь вам написать это. Но зачем тебе помощь? Разве код, который вы написали, не работает?

Так же, как в стороне вопрос. Какую версию PHP вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...