Сингулярное декомпозиция значений (SVD) в PHP

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

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

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

Solutions Collecting From Web of "Сингулярное декомпозиция значений (SVD) в PHP"

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

SVD-питон

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

ура

Изменить: модуль выше не делает ничего само собой, но есть пример, включенный в открывающиеся комментарии. Предполагая, что вы загрузили модуль 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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Функция exec ()

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

  • Функция system ()

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

  • Функция passthru ()

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

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

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

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