Совместная фильтрация: неперсонализированное сходство предметов к элементу

Я пытаюсь вычислить сходство элементов к элементу вдоль линий Amazon's «Клиенты, которые просмотрели / приобрели X, также просмотрели / купили Y и Z». Все примеры и ссылки, которые я видел, относятся к сходству в вычислительных элементах для ранжированных элементов, для поиска подобия пользователя или пользователя, или для поиска рекомендуемых элементов на основе истории текущих пользователей. Я хотел бы начать с нецелевого подхода, прежде чем учитывать предпочтения текущих пользователей.

Глядя на технический документ рекомендаций Amazon.com , они используют следующую логику для автономного сходства элементов товара:

For each item in product catalog, I1 For each customer C who purchased I1 For each item I2 purchased by customer C Record that a customer purchased I1 and I2 For each item I2 Compute the similarity between I1 and I2 

Если я правильно понимаю, к тому времени, когда мы находимся в «Compute similiarty между I1 и I2», у меня есть список предметов (I2), купленных в сочетании с одним значением I1 (внешний цикл).

Как выполняется этот расчет?

Другая идея заключается в том, что я переусердствую это и делаю это более сложным, чем мне нужно. Достаточно ли сделать запрос top-n на счет I2, купленный в сочетании с I1?

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

Я работал с алгоритмами сходства в прошлом, но они всегда включали ранг или оценку. Я думаю, что единственным способом, который это сработает, было бы построение матрицы показателей потребительского продукта 0/1 для покупки / покупки. Учитывая историю покупок и размер элемента, это может стать очень большим.

edit: хотя я назвал python как тег, я бы предпочел сохранить логику внутри db, предпочтительно используя Oracle PL / SQL.

  • pandas DataFrame comb_first и методы обновления имеют странное поведение
  • python pandas read_csv quotechar не работает
  • wxPython: хороший способ наложить wx.Panel на существующую wx.Panel
  • Наивное распараллеливание scipy.optimize.fmin
  • Ошибка: Сломанная труба
  • Обновление Django - ModelForm для динамического поля
  • подсчет ненулевых элементов внутри каждой строки и внутри каждого столбца массива 2D numpy
  • Как получить исходное представление строки в Python?
  • 3 Solutions collect form web for “Совместная фильтрация: неперсонализированное сходство предметов к элементу”

    На этой теме есть хорошая книга О'Рейли . В то время как технический документ может заложить логику в псевдокоде, подобном этому, я не думаю, что этот подход будет очень хорошо масштабироваться. Расчеты – это все вероятностные вычисления, поэтому такие вещи, как Байесская теорема, привыкли говорить: «Если человек приобрел X, какова вероятность того, что они приобрели Z?» Прямое чередование данных слишком усложняется. Вы должны пройти все это для каждого человека.

    Давайте поразмыслием с коллективной фильтрацией. предположим, что у нас есть матрица покупки

      Item1 Item2 ... ItemN User1 0 1 ... 0 User2 1 1 ... 0 . . . UserM 1 0 ... 0 

    Затем мы можем вычислить подобие товара, используя вектор-столбец, например, использовать косинус. У нас есть матрица симметрии подобия элемента, как показано ниже

      Item1 Item2 ... ItemN Item1 1 1/M ... 0 Item2 1/M 1 ... 0 . . . ItemN 0 0 ... 1 

    Это можно объяснить так: «Клиенты, которые просмотрели / приобрели X, также просмотрели / купили Y, Z, …» (Collaborative Filtering). Поскольку векторизация элемента основана на приобретенном пользователем.

    Логика Amazon точно такая же, как и выше, хотя целью является повышение эффективности . Как они сказали

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

    @Neil или тот, кто приходит к этому вопросу позже:

    Выбор показателя сходства зависит от вас, и вы можете оставить его податливым в будущем. Ознакомьтесь с статьей Википедии о норме Фробениуса для начала. Или как в приведенной ссылке, коэффициент Jaccard cos(I1,I2) .

    Пользовательский элемент -vs-user-user -vs- item-item или любая комбинация не могут быть объективно отреагированы. Это зависит от того, какие данные вы можете получить от своих пользователей, как пользовательский интерфейс извлекает из них информацию, какие части ваших данных вы считаете надежными и ваши собственные временные ограничения (насколько это касается гибридов).

    Поскольку многие люди просили магистерские диссертации по вышеуказанным вопросам, вы, вероятно, захотите начать с самого простого реализуемого решения, оставив место для роста сложности алгоритма.

    Python - лучший язык программирования в мире.