Как я могу реализовать механизм рекомендаций? - PullRequest
17 голосов
/ 20 ноября 2010

Пожалуйста, будьте терпеливы с моим письмом, так как мой английский не владеет.

Как программист, я хочу узнать об алгоритме или интеллекте машинного обучения, которые реализованы в системах рекомендаций или связанных с нимисистемы.Например, самый очевидный пример был бы от Amazon.У них действительно хорошая система рекомендаций.Они узнают: если вам нравится это , вам также может понравиться это или что-то еще, например: какой процент людей любит это и это вместе.

Конечно, я знаю, что Amazon - это большой сайт, и они вложили много денег и денег в эти системы.Но, на самом базовом ядре, как мы можем реализовать что-то подобное в нашей базе данных?Как мы можем определить, как один объект связан с другим?Как мы можем построить статистическую единицу, которая обрабатывает такие вещи?

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

Ответы [ 4 ]

18 голосов
/ 20 ноября 2010

Это два различных типа рекомендательных механизмов.

Самым простым является продукт, основанный на элементах, т. Е. «Клиенты, которые купили продукт A, также купили продукт B».Это легко реализовать.Сохраните разреженную симметричную матрицу nxn (где n - количество элементов).Каждый элемент (m [a] [b]) - это количество раз, когда кто-либо покупал элемент «a» вместе с элементом «b».

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

Лучшее решение, но еще более сложное, - это метод Restricted BoltzmannМашины.Есть введение в них здесь

3 голосов
/ 20 ноября 2010

Первая попытка может выглядеть следующим образом:

//First Calculate how often any product pair was bought together
//The time/memory should be about Sum over all Customers of Customer.BoughtProducts^2
Dictionary<Pair<ProductID,ProductID>> boughtTogether=new Dictionary<Pair<ProductID,ProductID>>();
foreach(Customer in Customers)
{
    foreach(product1 in Customer.BoughtProducts)
        foreach(product2 in Customer.BoughtProducts)
            {
                int counter=boughtTogether[Pair(product1,product2)] or 0 if missing;
                counter++;
                boughtTogether[Pair(product1,product2)]=counter;
            }
}

boughtTogether.GroupBy(entry.Key.First).Select(group.OrderByDescending(entry=>entry.Value).Take(10).Select(new{key.Second as ProductID,Value as Count}));

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

Это может стать слишком медленным или стоить слишком много памяти для больших баз данных.

0 голосов
/ 03 сентября 2015

Существует также Forex.io , если вы ищете решение с открытым исходным кодом или SaaS-решения, такие как mag3llan.com .

0 голосов
/ 20 ноября 2010

Я думаю, вы говорите о системах базы знаний .Я не помню язык программирования (может быть, LISP), но есть реализации.Также посмотрите на OWL .

...