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

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

Я дико извиняюсь, но не проще ли посчитать Евклидово растояние в пространстве оценок? Это позволяет работать не с бинарными, а с числовыми оценками… степень похожести двух критиков исчисляется как:



при этом если в каком-то компоненте вектора оценок c у них нет общих оценок (например, критик i оценил один фильм а критик j его не оценил) то это просто ноль. Можно попарно считать похожести, есть модные и мощные алгоритмы матричного расчета этого расстояния (искать по словам “Information Theory, Inference and Learning Algorithms”, pp. 284–292, David MacKay, Cambridge University Press, 2003.)
Насколько я помню, в той книжке есть и этот метод — просто применяются для несколько разных вещей.
Согласен, для таких исходных данных проще посчитать Евклидово расстояние. Я о чем то похожем написал в середине статьи:
Поэтому коэффициент Танимото, на мой взгляд, стоит использовать, если количество вариантов оценок не больше 2-3 (например, «понравилось-не понравилось» или «рекомендую-не смотрел-не рекомендую»)

Просто задача была применить этот алгоритм к именно таким исходным данным.
это выйдет только если каждый эксперт дал оценку каждому фильму.
иначе сравниваемые вектора получаются «дырявыми», как, собственно и вся матрица любви к фильмам ;)

а уж если, эксперты были прилежны и матрица полная, то намного лучше использовать не евклидово расстояние, а метрику Махаланобиса :)

Даже если матрица дырявая я бы пробовал пробиваться в сторону PCA/Махаланобиса, ну а уж если матрица просто разряжённая, то тогда читаем вдумчиво эту статью и грустно бродим по ссылкам :)
Это требует вычисления covariance matrix, что влечет за собой дополнительные усложнения — а в простейшем случае диагональной единичной матрицы мы получаем все то же Евклидово растояние ;-)
разница между Махалонобисовской и Евклидовой метрикой может быть гиганской, в прикладном смысле особенно.
вы можете быть удивлены что расстояние между женскими и мужскими интересами в Махаланобисовской метрике может оказаться огромным, в то время как в Евклидовой оно может быть довольно скромным ;)
НЛО прилетело и опубликовало эту надпись здесь
Какой смысл при расчете схожести интересов учитывать несовпадающие множества?

Допустим, а = 1000, b = 100, c = 100 (то есть все 100 фильмов которые посмотрел b, также посмотрел и a, и также их оценил).
По сути совпадение интересов = 100%. А по вашему коэффу = 100/(1000+100-100)=0.1, то есть совпадений якобы нет.
Очевидно, что для данной цели алгоритм ошибочен.
"-c" в знаменателе там явно лишнее, да и делается подобный расчет куда проще с помощью setов.

  critic_1 = set(['Film A', 'Film B'])
  critic_2 = set(['Film A'])
  print 1. * len(critic_1 & critic_2) / len(critic_1 & critic_2)

"1." там для того, чтобы в float расчет шел.
упс:
print 1. * len(critic_1 & critic_2) / len(critic_1 | critic_2)

там "|" должно быть в знаменателе
да, все правильно, автор говорит про множества, а пользуется списками
Попробуйте применить метод на базе ru.wikipedia.org/wiki/Netflix_Prize — там есть база оценок, вполне можно попробовать и сравнить с результатами лучших алгоритмов.
Я бы тупо посчитал корреляцию оценок по фильмам, оценённым обоими критиками.
Особенности:
  • Симметричность (А похож на Б так же, как Б на А)
  • Устойчивость к константному смещению и множителю. Если я по душе очень критичен и в целом занижаю оценки даже хорошим вещам, а другой более лоялен и ставит всем на балл выше, мы всё равно коррелируем по вкусу.
  • Учёт антикорреляции. Если я оценил три фильма 1/3/5, а оппонент — 5/3/1, то корреляция скажет, что у нас абсолютно противоположные вкусы, а предложенный автором топика метод отметит сходство во втором фильме.
  • Не работает с теми, кто всем ставит одинаковые оценки (если подумать, это логично: такой критик вообще бесполезен).
Пример:
Автор топика привёл лишь одну из методик, предложенных в упоминаемой им книге. В самой же книге есть способы определения того, действительно ли автор поставил «правильную» оценку или завысил/занизил. Для этого нужно больше данных и сравнений с другими пользователями, с целью получения более репрезентативной выборки.

P.S. Смысла статьи не понял. Это простой «копипаст» из книги без какого-либо анализа предложенной методики и привнесения чего-то дополнительного. Наверное, достаточно было просто сказать, что есть такая замечательная книга, в которой описаны такие вот интересные методики для осуществления коллаборативной фильтрации данных.
Видимо у автора комментария какая-то другая версия книги. Никак не могу найти ту страницу в своей книге, которую я копипастил.
Прошу прощения, перепутал.
Не проще узнать величину разности общих элементов, деленную на их количество? Ну и потом нормализовать в зависимости от системы оценок.
думаю, в реальных применениях (типа имхонета) важна скорость. на сайт постоянно заходят сотни и тысячи человек, постоянно выставляют оценки (и, соответственно, если A и Б имели три дня назад общие оценки, сегодня один из них (А) посмотрел фильм, выставил оценку и она отличается от оценки другого (Б), так что теперь А и Б не похожи). Следовательно пересчитывать «похожесть» надо постоянно, а если у каждого из пользователей 500 оценок (вполне нормальное число для рейтинга фильмов), а пользователей у нас 10'000, то пересчитать схожесть по 500 позициями каждого с 10'000 других — слишком медленно должно быть.
Pearson's r уже не катит?
Скромное мнение:
Самая большая проблема подобных расчётов — это шум. Чем проще алгоритм, тем менее он устойчив к шуму. То есть на мой взгляд и коэффициент Танимото и, любимое всеми комментаторами, Евклидово расстояние слишком прямолинейны.

Самый распространённый шум — отсутствие выбора. И отсутствие оценки фильма, и выбор значения по умолчанию. Это как дата рождения в формах регистрации — многие указывают только год или вообще не хотят ничего указывать и получается, что самая популярная дата дня рождения — первое января…
недавно давал подобную задачку своим студентам, решали через
коэффициент конкордации и коэффициенты парной ранговой корреляции
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации