Как хранить наборы, чтобы быстро находить похожие шаблоны?

StackOverflow https://stackoverflow.com/questions/462563

Вопрос

(Это не домашнее задание и не проблема с работой.Это просто мой личный интерес / занятие и полностью вымышленное.Но меня интересует хороший алгоритм или структура данных.)

Давайте предположим, что я бы запустил сайт знакомств.И мой специальная функция было бы так, что синглы были соответствует вкусу фильма.(Почему бы и нет?)

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

Пример

movies   A B C D E F G H I J K L M ...
user Xm  9 5   1   1   5
user Ym      4 6 1         8
user Zf  9   6 4           7

Расстояние (X, Z) = среднее значение (абс (9-9) + абс (1-4)) = 1,5

Расстояние (Y, Z) = среднее значение (абс (4-6) + абс (6-4) + абс (8-7)) = 1,666

Итак , мистерX немного лучше подходит миссисZ, чем Mr.Y делает.

Мне это нравится в душе ...

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

Постарайтесь иметь в виду, что это также должно работать с тысячами возможных фильмов, пользователями, которые оценивают только около 20-50 фильмов, и тысячами пользователей.

(Поскольку это ментальная головоломка, а не реальная проблема, обходные пути на самом деле не помогают.)

Каким был бы ваш алгоритм поиска или структура данных?

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

Решение

Звучит очень похоже на Приз Netflix вызов, точнее, первая половина самого популярного подхода.Возможные реализации того, что вы пытаетесь сделать, многочисленны и разнообразны.Ни один из них не является исключительно эффективным, и показатель L1 не является особенно хорошим вариантом для надежных корреляций.

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

Похоже, вы ищете ближайший сосед в кинопространстве.И ваша функция расстояния - это Метрика L1.Вероятно, вы можете использовать пространственный индекс в каком-то роде.Может быть, вы сможете использовать методы из совместная фильтрация.

CREATE TABLE data (user INTEGER, movie INTEGER, rate INTEGER);

SELECT  other.user, AVG(ABS(d1.rate - d2.rate)) AS distance
FROM    data me, data other
WHERE   me.user = :user
    AND other.user <> me.user
    AND other.movie = me.movie
GROUP BY
    other.user
ORDER BY
    distance

Сложность будет равна O(n1.5)) вместо O(n2), так как там будет n сравнения с sqrt(n) фильмы (среднее количество фильмов, заполненных вместе каждой парой).

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