Как стать автором
Обновить

Комментарии 17

Спасибо. Когда читал и пробовал коллаборативную фильтрацию, эта лямбда нигде не обьяснялась (достаточно понятно, чтобы я понял).
Вообще, ваша серия постов — самое понятное практическое описание этих механизмов, что я встречал (а на русском так чуть ли не единственное). Потомки вас не забудут =)
Скажите, а вы тот Сергей Николенко, которого я иногда вижу в ЧГК? Или однофамилец?
Эх, надо тогда как-то шире рекламировать, а то потомки не забудут потому, что не узнают никогда. :)

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

Просто тема эта не настолько популярна пока. 99,9% читателей хабра с этой информацией просто нечего делать. Да, она интересная и хорошо описанная, но практического применения, тем более прямо сейчас, нет. Даже потрогать нечего (кроме предыдущей вашей статьи, но и там это требует усилий).

Могу предложить 2 вещи:
1. Сделайте общее оглавление у ваших статей, чтобы их проще было найти и прочитать вместе. Это было бы удобно.
2. Постарайтесь найти тему, которая имела бы практическое применение для большего числа людей.

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

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

Вот лично меня очень интересуют подходы к модификации вышеприведённых алгоритмов на случай большого количества данных, когда человеку нужно дать рекомендации, а сделать прогноз для всех имеющихся элементов невозможно из-за их количества — нужно как-то подбирать кандидатов, нужно повсюду бороться с квадратичной сложностью и т.п. Статей на эту тему мало (вероятно, из-за того, что тут много специфичного для каждой задачи).
Оглавление – это отличная мысль! Вы не знаете, на хабре можно сделать заглавный пост, который будет всегда висеть сверху?

Про практическое применение не очень понял – то есть я вроде бы стараюсь, даже вот работающий код запостил. Понятно, конечно, что я не могу для каких-то неизвестных мне проектов конкретные решения предлагать, а могу только объяснять общую механику происходящего. Но вот код, который был в прошлый раз, действительно лёг в основу одной из стратегий, которые реально работают в surfingbird (там, конечно, в production код слегка посложнее :), но по сути именно такой).

На случай большого количества данных – вообще-то это и есть алгоритмы для большого количества данных. :) Вряд ли у вас база рейтингов больше, чем у Netflix и Amazon. Разложение матриц – алгоритм как раз для того, чтобы от O(M*N) перейти к O(M+N); про скорость сходимости так сразу с ходу не скажу, надо посмотреть, но в любом случае вероятностное разложение матриц хорошо параллелизуется – когда-нибудь обязательно расскажу о параллельной реализации на GraphLab. Так что да, именно эти алгоритмы и работают для больших массивов данных, и именно их и надо реализовывать в первую очередь.
Я имел в виду более практическое применение, буквально рецепты вида:
1. Экспортируем из вашей базы данных csv в формате <id пользователя>,<оценка>
2. Берём такой-то скрипт/программу/библиотеку, скармливаем ему данные
3. Получившийся результат загружаем в вашу БД
4. При отображении элемента на вашем сайте делаем запрос вида «SELECT ...», чтобы получить список похожих элементов и вывести их рядом.
Такого рода статья, я думаю, была бы популярнее.

Насчёт многоданных. Да, я понимаю, что на большом количестве данных только такие алгоритмы и будут работать. Но при практической реализации возникают проблемы.
* Длительность расчёта факторов пропорциональна количеству оценок, т.е. будет расти линейно с ростом их количества. А ресурсы не бесконечны, а значит нужно каким-то образом приближать её к O(1). Как?
* Расчёт качественных факторов длительный процесс. Что делать с пользователями, которые только пришли, и которым уже нужно давать рекомендации, а пересчёт факторов запланирован на завтра?
* Мы расчитали факторы и нужно найти 10 рекомендаций для пользователя. А элементов в базе 10 миллионов. Как найти 10 лучших из них, не расчитывая прогноз для всех
*… таких проблем возникает много, и без хорошего понимания математических методов и одновременно программирования их качественно решать сложно.
Да, ну так ведь предыдущий скрипт так и делает: кушает данные в формате
<id пользователя>; <id продукта>; <оценка>
и выдаёт ответ в виде
<id пользователя>; <список факторов>
и
<id продукта>; <список факторов>
Чтобы затем сделать рекомендацию, нужно взять вектор факторов пользователя и умножить его скалярно на вектор факторов продукта (и даже это, кажется, в скрипте тоже было). Обращение к базам данных, каюсь, не вписывал, но это уж совсем не по теме.

Спасибо за отличные вопросы! На них, безусловно, ответы уже существуют. :) Например, особенно интересный вопрос – про «только что пришедших», особенно если его чуть обобщить: пользователь пришёл на сайт, сделал двадцать лайков и хочет, чтобы что-нибудь тут же изменилось, а пересчёт запланирован на завтра. Это так называемые онлайн-рекомендации, алгоритмы есть, постараюсь про них рассказать. Но вообще я планировал переходить к частностям чуть позже, когда разберусь с концептуальными вопросами – уже шесть статей было, а я ещё, чёрт возьми, про теорему Байеса не рассказал. :)
Чтобы применить ваш скрипт из предыдущего поста для реального проекта — нужно приложить много усилий, чтобы понять его и использовать в своём проекте, даже в самом простом случае. Плюс вы ничего не писали насчёт того, что «возьмите это и используйте у себя». А значит никто этого делать и не будет.
Я этим не хочу сказать, что статья бесполезна. Для меня она была полезна, чтобы как минимум сравнить ваш скрипт с тем, что я писал, основываясь на одной статье, чтобы лучше понять как это работает. Но полученную из неё информацию для большинства всё-таки сложно применить на практике, а значит она скоро забудется, а значит статья автоматически квалифицируется мозгом как «неинтересная».

Насчёт моих вопросов. Если вы напишите про них статьи — они будут очень интересны для меня, но, боюсь, для большинства это будет ещё более специализированные статьи, чем ваши последние, что не добавит им популярности. Вы ведь заметили, что оценка ваших статей обратно пропорциональна широте описываемоей темы? Про рекомендации в целом — статьи оценены выше, про более узкие темы — ниже.
Как следует из предисловия к этому тексту, заметил. :)
И именно поэтому собираюсь писать более общо и концептуально.
Заглавный пост, кажется, нельзя сделать. Не тот формат сайта.
P.S. Кстати, я пока поддерживал оглавление на своей страничке:
logic.pdmi.ras.ru/~sergey/index.php?page=popular
хотя это, конечно, тоже трудно назвать хорошей рекламой. :)
Сергей, спасибо, статьи очень в тему и невероятно вовремя!
И да, хорошо бы все это масштабировать на «очень дофига данных». Ведь насколько я понимаю, рекомендательные системы наиболее часто работают именно с большими коллекциями.
Я пока могу просто ссылку дать: graphlab.org
Там есть прямо примеры кода сильно параллельных рекомендательных систем.
Подробно пока руки не дошли описывать, но когда-нибудь текст о рекомендациях на графлабе обязательно будет.
Большое спасибо за подробное описание. В русскоязычном сегменте сети информации по коллаборативной фильтрации очень мало, а ведь она применима едва ли не для каждого второго веб-сервиса. Для одних это «секрет фирмы», для остальных «тормоз» в развитии. Так что ещё раз спасибо.

Два вопроса:
Вы изучали опубликованные алгоритмы победителей Netflix Prize?
Какой у вас средний процент ошибки предсказаний или СКО на SurfingBird (если не секрет)?

(1) Изучали, конечно. Это отдельная интересная тема – как совместить несколько алгоритмов.
(2) Боюсь, секрет. :)
Рад, что интересно!

(1) Конечно, изучали. Это отдельный интересный вопрос: главный урок Netflix Prize — в том, как объединять кучу разных моделей в одну рекомендацию; когда-нибудь и до него дойдём.
(2) Боюсь, секрет. :)
Отличные статьи, Сергей! Продолжайте писать, пожалуйста.

Очень ясно все — даже спросить нечего, особенно видео про SVD порадовало.

За рейтингом не гонитесь, долгосрочный эффект есть — вы уже для широких масс персона #1 в отрасли!
Спасибо, Сергей, очень наглядно все.

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

И, кстати, у того скрипта какая лицензия? Ну, если его «взять и использовать у себя»?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий