Я хотел бы реализовать сингулярную декомпозицию значений (SVD) в PHP. Я знаю, что есть несколько внешних библиотек, которые могли бы сделать это для меня. Но у меня есть два вопроса относительно PHP: 1) Как вы думаете, возможно ли и / или разумно кодировать SVD в PHP? 2) Если (1) – да: можете ли вы помочь мне закодировать его на PHP?
Я уже сам кодировал некоторые части SVD. Вот код, который я комментировал в ходе действия. Некоторые части этого кода не совсем корректны.
Было бы здорово, если бы вы могли мне помочь. Заранее большое спасибо!
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 ++, поэтому, возможно, было бы лучше, если бы вы могли сделать это на одном из этих языков и назвать их функцией, чтобы получить ваши результаты. Вы можете найти реализацию алгоритма здесь , так что вы можете вести себя через него.
О вызове функции можно использовать:
Системная функция весьма полезна и мощна, но одна из самых больших проблем заключается в том, что весь полученный текст из программы переходит непосредственно в выходной поток. Будут ситуации, когда вы можете отформатировать полученный текст и отобразить его каким-либо другим способом или вообще не отображать его.
Системная функция в PHP принимает строковый аргумент с командой для выполнения, а также любые аргументы, которые вы хотите передать этой команде. Эта функция выполняет указанную команду и выгружает любой результирующий текст в выходной поток (либо выход HTTP в ситуации веб-сервера, либо консоль, если вы используете PHP в качестве инструмента командной строки). Возврат этой функции является последней строкой вывода из программы, если она выводит текст.
Одна увлекательная функция, которую PHP предоставляет аналогично тому, что мы видели до сих пор, – это функция passthru. Эта функция, как и другие, выполняет программу, о которой вы рассказываете. Тем не менее, он затем немедленно отправляет исходный вывод из этой программы в выходной поток, с которым работает PHP в настоящее время (например, HTTP в сценарии веб-сервера или оболочка в версии командной строки PHP).
Да. это вполне возможно реализовать на PHP. Я не знаю, каковы разумные временные рамки для выполнения и насколько большой он может вычислить. Мне, вероятно, придется реализовать алгоритм, чтобы получить черную идею.
Да, я могу помочь вам закодировать его. Но зачем вам нужна помощь? Не работает ли код, который вы написали?
Как вопрос в стороне. Какую версию PHP вы используете?