Вопрос

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

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

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

Это было полезно?

Решение

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

SVD-python

Тем не менее, как упоминали другие, я бы не ожидал, что смогу выполнять очень мощный 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.

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

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

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

Другие советы

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

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

Я знаю, что это старый вопрос, но вот мои 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 в качестве языка сценариев для написания эквивалента BATCH-файлов для DOS или эквивалента сценариев оболочки для Linux.Я обнаружил, что большую часть того, что мне нужно сделать, можно выполнить изнутри PHP.Существует даже проект, позволяющий создавать настольные приложения с помощью PHP — проект PHP-GTK».

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

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

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

  • Функция exec()

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

  • Функция system()

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

  • Функция passthru()

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top