Рекомендательные системы: Часть 2. Механизмы с открытым исходным кодом

Программное обеспечение для построения рекомендательных систем

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

М. Тим Джонс, инженер-консультант, Emulex

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



29.04.2014

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

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

На рис. 1 показана простая экосистема с рекомендательным механизмом. Эта экосистема состоит из следующих частей.

  • Небольшая совокупность пользователей
  • Сервис
  • Средства выделения поведения отдельного пользователя при взаимодействии с сервисом (покупки, просмотры и т. д.)
  • Рекомендательный механизм, который вычисляет и хранит артефакты рекомендаций
Рисунок 1. Простая экосистема с рекомендательным механизмом
Image shows illustration of simple ecosystem of a recommendation system

Теперь я представлю простую реализацию кластеризации на языке Ruby. Эта реализация группирует схожих пользователей на основе их индивидуального поведения.

Кластеризация для коллаборативной фильтрации на основе пользователей

В первой статье была рассмотрена коллаборативная фильтрации на основе пользователей для простой совокупности из четырех пользователей. Чтобы выработать рекомендации для этой совокупности, необходимо сначала классифицировать этих пользователей на основе их поведения. В этом первом примере осуществляется классификация пользователей посредством простого алгоритма кластеризации под названием k-means (k-средние).

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

На рис. 2 показан учебный набор данных для четырех пользователей, читающих статьи в блогах.

Рисунок 2. Учебные данные для поведения пользователей, читающих статьи в блогах
Image shows sample data for users' blog-reading behavior

В листинге 1 показана Ruby-реализация класса Cluster, который представляет собой кластер для алгоритма k-средних.

Листинг 1. Класс Cluster на языке Ruby
class Cluster

  # Инициализировать экземпляр класса
  def initialize
    @people = Array.new
    @vcentroid = Hash.new( "0" )
  end

  # Добавить вектор признаков к кластеру
  def add( person )
    @people.push( person )
  end

  # Удалить вектор признаков из кластера
  def remove( person )
    @people.delete( person )
  end

  # Возвратить центр кластера
  def get_people
    return @people
  end

  # Вычислить вектор центра по членам кластера
  def calculate_centroid

    #  Очистить вектор центра 
    @vcentroid.clear
    tcentroid = Hash.new( "0" )

    # Выполнить итерации с каждым вектором признаков
    @people.each do |person|

      # Просуммировать векторы признаков в этом кластере
      person.each do |key,value|
        tcentroid[key] = tcentroid.delete(key).to_i + value.to_i
      end

    end

    # Вычислить среднее для центра
    tcentroid.each do |key,value|
      @vcentroid[key] = value.to_f / @people.length
    end

  end

  # Вычислить геометрическое расстояние
  def calculate_gd( person )

    gd = 0.0

    person.each do |key,value|
      gd += (@vcentroid[key].to_f-value.to_f) * (@vcentroid[key].to_f-value.to_f)
    end

    gd = Math.sqrt(gd)

    return gd

  end

end

Класс Cluster содержит члены кластера в виде массива и центр кластера как хеш (где ключ — это название блога; а значение — это просмотренные статьи). Метод initialize создает и массив, и хеш.

Управление членами кластера осуществляют следующие три метода.

  • Метод add добавляет person к кластеру
  • Метод remove удаляет person.
  • Метод get_people извлекает массив с целью итеративного прохождения по этому массиву.

Управление кластером осуществляют следующие два метода. Метод calculate_centroid обновляет среднее кластера в соответствии с его нынешними членами. Метод calculate_gd возвращает евклидово расстояние между центром кластера и переданным объектом person.

В листинге 2 показана Ruby-реализация алгоритма k-средних, который оперирует учебными данными (см. рис. 2).

Листинг 2. Реализация базового алгоритма k-средних
def kmeans

  # Хэши учебных пользователей
  marc = { 'linux' => '13', 'oss' => '10', 'cloud' => '6',
           'java' => '0', 'agile' => '0' }
  megan = { 'linux' => '3', 'oss' => '0', 'cloud' => '1',
            'java' => '6', 'agile' => '7' }
  elise = { 'linux' => '11', 'oss' => '0', 'cloud' => '9',
            'java' => '0', 'agile' => '1' }
  jill = { 'linux' => '0', 'oss' => '3', 'cloud' => '0',
           'java' => '9', 'agile' => '8' }

  # Задать два кластера и каждый из них инициализировать двумя пользователями
  cluster1 = Cluster.new
  cluster1.add(marc)
  cluster1.add(megan)

  cluster2 = Cluster.new
  cluster2.add(elise)
  cluster2.add(jill)

  changed = true

  # Повторять до тех пор, пока не прекратятся изменения в составе кластеров
  while changed do

    changed = false

    # Пересчитать центр каждого кластера (среднее)
    cluster1.calculate_centroid
    cluster2.calculate_centroid

    # Получить сведения о членах каждого кластера
    people1 = cluster1.get_people
    people2 = cluster2.get_people

    # Проверить члены кластера 1 относительно центров каждого кластера
    puts "Checking cluster 1"
    people1.each do |person|
      if cluster2.calculate_gd(person) < cluster1.calculate_gd(person) then
        puts "Feature vector moved from cluster 1 to cluster 2"
        cluster1.remove(person)
        cluster2.add(person)
        changed = true
      end
    end

    # Проверить члены кластера 2 относительно центров каждого кластера
    puts "Checking cluster 2"
    people2.each do |person|
      if cluster1.calculate_gd(person) < cluster2.calculate_gd(person) then
        puts "Feature vector moved from cluster 2 to cluster 1"
        cluster2.remove(person)
        cluster1.add(person)
        changed = true
      end
    end

  end

  puts

  puts "Cluster 1 contains"
  people = cluster1.get_people
  people.each do |person|
    person.each do |key,value| print "#{key}=#{value} " end
    puts
  end
  puts

  puts "Cluster 2 contains"
  people = cluster2.get_people
  people.each do |person|
    person.each do |key,value| print "#{key}=#{value} " end
    puts
  end
  puts

end

Код в листинге 2 начинается с добавления учебных данных в кластеры. Затем вычисляется центр для каждого кластера (как среднее значение его членов), после чего проверяется расстояние от каждого члена до этих двух кластеров. Если член находится дальше от центра своего нынешнего кластера, чем от центра другого, он удаляется из своего исходного кластера и добавляется к другому кластеру. После того как все члены проверены, выполняется повторное вычисление центров и повторная проверка членов. Алгоритм останавливается, когда изменения прекращаются.

Чтобы сгруппировать учебных пользователей в два кластера (k = 2), вызовите метод kmeans, как показано в следующем консольном сеансе (см. листинг 3).

Листинг 3. Исполнение простой реализации алгоритма k-средних
$ ruby kmeans.rb
Checking cluster 1
Feature vector moved from cluster 1 to cluster 2
Checking cluster 2
Feature vector moved from cluster 2 to cluster 1
Checking cluster 1
Checking cluster 2

Cluster 1 contains
cloud=6 java=0 linux=13 oss=10 agile=0 
cloud=9 java=0 linux=11 oss=0 agile=1 

Cluster 2 contains
cloud=0 java=9 linux=0 oss=3 agile=8 
cloud=1 java=6 linux=3 oss=0 agile=7 

$

Алгоритм успешно поместил Марка и Элизу в кластер 1, а Меган и Джилл — в кластер 2. После завершения кластеризации рекомендательный механизм сможет использовать различия между членами кластера с целью формирования рекомендаций.

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


Рекомендательные механизмы SUGGEST и Top-N

SUGGEST— это рекомендательный механизм типа Top-N реализованный в виде библиотеки. Механизм SUGGEST, созданный Джорджем Кариписом (George Karypis) в Миннесотском университете, использует несколько алгоритмов коллаборативной фильтрации и реализует коллаборативную фильтрацию на основе пользователей и на основе элементов. Конкретный алгоритм можно указать при инициализации определенного набора данных.

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

Механизм SUGGEST предоставляет простой API-интерфейс. Для создания рекомендательного механизма на языке программирования C вам потребуются всего три функции.

  • Функция SUGGEST_Init загружает ретроспективные транзакции, определяет конкретный рекомендательный алгоритм и инициализирует экземпляр рекомендательного механизма.
  • Функция SUGGEST_TopN вычисляет рекомендацию на основе переданных учебных данных.
  • Функция SUGGEST_Clean высвобождает экземпляр рекомендательного механизма, который создала функция SUGGEST_Init.

Четвертая функция, SUGGEST_EstimateAlpha, определяет оптимальное альфа-значение для вероятностного алгоритма (если этот алгоритм используется).

В листинге 4 представлена простая реализация приложения с использованием рекомендательного механизма SUGGEST.

Листинг 4. Учебное приложение (на языке C), использующее рекомендательный механизм SUGGEST
#include <stdio.h>
#include "suggest.h"

int nusers = 4;
#define MARC   0
#define MEGAN   1
#define ELISE   2
#define JILL   3

int nitems = 20;   // Marc  Megan  Elise  Jill
#define LINUX1   0  //  1      0      1     0
#define LINUX2   1  //  1      0      0     1
#define LINUX3   2  //  1      0      1     0
#define LINUX4   3  //  1      1      1     0
#define OSS1   4  //  1      1      0     1
#define OSS2   5  //  0      0      1     1
#define OSS3   6  //  1      0      1     0
#define CLOUD1   7  //  0      1      1     0
#define CLOUD2   8  //  1      1      1     1
#define CLOUD3   9  //  0      0      0     1
#define CLOUD4   10 //  1      0      1     1
#define CLOUD5   11 //  0      0      0     0
#define JAVA1   12 //  0      1      0     1
#define JAVA2   13 //  0      1      0     0
#define JAVA3   14 //  1      1      0     1
#define JAVA4   15 //  0      1      1     1
#define JAVA5   16 //  0      0      0     1
#define AGILE1   17 //  0      1      0     1
#define AGILE2   18 //  0      1      0     0
#define AGILE3   19 //  0      0      1     1

#define NTRANS   40

// Ретроспективные транзакции пользователи-элементы.
int userid[NTRANS] = 
  { MARC , MARC , MARC , MARC , MARC , MARC , MARC , MARC , MARC,

    MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, MEGAN, 

    ELISE, ELISE, ELISE, ELISE, ELISE, ELISE, ELISE, ELISE, ELISE, 

    JILL, JILL, JILL, JILL, JILL, JILL, JILL, JILL, JILL, JILL, JILL, JILL, 
  };

int itemid[NTRANS] =
  { /* Число чтений в блоге для Марка  */
    LINUX1, LINUX2, LINUX3, LINUX4, OSS1, OSS3, CLOUD2, CLOUD4, JAVA3,

    /* Число чтений в блоге для Меган  */
    LINUX4, OSS1, CLOUD1, CLOUD2, JAVA1, JAVA2, JAVA3, JAVA4, AGILE1, AGILE2,

    /* Число чтений в блоге для Элизы  */
    LINUX1, LINUX3, LINUX4, OSS2, OSS3, CLOUD1, CLOUD2, JAVA4, AGILE3,

    /* Число чтений в блоге для Джилл  */
    LINUX2, OSS1, OSS2, CLOUD2, CLOUD3, CLOUD4, JAVA1, JAVA3, JAVA4, JAVA5, AGILE1, AGILE2
  };


int main()
{
  int *rcmd_handle;
  int behavior[7]={LINUX1, LINUX2, LINUX4, OSS1, OSS2, CLOUD1, CLOUD3 };
  int recommendation[2];
  int result, i;

  rcmd_handle = SUGGEST_Init( nusers, nitems, NTRANS, userid, itemid,
                              3, 2, 0.0 );

  result = SUGGEST_TopN( rcmd_handle, 7, behavior, 2, recommendation );

  if (result) {
    printf("Recommendations (%d) are %d and %d\n", result,
            recommendation[0], recommendation[1]);
  } else printf("No recommendation made.\n");


  SUGGEST_Clean( rcmd_handle );

  return 0;
}

Листинг 4 начинается с определения ретроспективных данных, представленных в двух массивах (users и items). Эти два массива связаны друг с другом, поскольку user [index] определяет транзакцию user-item (элемент массива (users[0] купил элемент массива items[0], и т. д.). Для простоты изложения и удобства чтения эти массивы задаются в порядке user-item.

Использование решения SUGGEST начинается в короткой функции main в Листинге 4. В этом месте инициализируем рекомендательную систему, задавая учебные данные user-item (которые в совокупности представляют транзакции нескольких пользователей над набором элементов). Затем массивы user и itemsпередаются в функцию SUGGEST_Init вместе с их предельными и допустимыми значениями (идентификаторы user и item). Кроме того, указывается рекомендательный алгоритм типа Top-N на основе элементов (рекомендательный алгоритм типа Top-N на основе пользователей с функцией подобия на основе косинуса) и размер соседства для рекомендации. Затем наша "корзина" заполняется элементами для вычисления запроса на рекомендацию, и вызывается функция SUGGEST_TopN для выработки рекомендации. В конце происходит высвобождение ресурсов, связанных с рекомендательной системой, и исполнение завершается. Обратите внимание, что в этом примере веб-сайт предлагает 20 статей по пяти темам, располагая ретроспективными данными по четырем пользователям.

Исполнение учебного рекомендательного механизма SUGGEST показано в следующем консольном сеансе (листинг 5).

Листинг 5. Исполнение рекомендательного механизма SUGGEST с учебными данными
$ ./topn
Recommendations (2) are 2 and 8
$

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

SUGGEST — это простая, но эффективная реализация алгоритмов коллаборативной фильтрации типа Top-N.


Веб-сервисы RESTful-стиля и механизм easyrec

В рекомендательном механизме с открытым исходным кодом под названием easyrec применяется новаторский подход к конструированию рекомендательного сервиса (разработка и техническое сопровождение easyrec осуществляет компания Research Studios Austria при финансовой поддержке Федерального министерства науки и исследований Австрии).

Механизм easyrec представляет интерфейс на базе REST (Representational State Transfer), что позволяет полностью изолировать его языка программирования, который применяет разработчик. Такой подход расширяет возможности разработчиков по интеграции сервиса с приложениями конечного пользователя и повышает масштабируемость сервиса.

API-интерфейс easyrec содержит богатый набор RESTful-интерфейсов, которые охватывают все возможные действия, необходимые рекомендательной системе, включая приобретение, просмотр и ранжирование элементов. Эти действия записаны в базе данных easyrec. Рекомендации предоставляются посредством специального набора интерфейсов, таких как "элементы, связанные с данным элементом", "другие пользователи также просмотрели эти элементы", "конкретные рекомендации для данного пользователя" и "другие пользователи также приобрели данный элемент". Эти базовые рекомендательные действия охватывают наиболее распространенные случаи, встречающиеся во многих сценариях прогнозирования. API-интерфейс easyrec поддерживает ответы в форматах XML и JSON.

Теперь я покажу пример запроса по формированию рекомендации для конкретного пользователя с помощью механизма easyrec. Решение easyrec предлагается в виде пакета, который вы сможете интегрировать в свою среду. Кроме того, в составе этого пакета предоставляется демонстрационный сервер, который можно использовать для тестирования. На следующем этапе вы используете этот сервер для запроса рекомендаций с использованием тестовых данных easyrec.

Чтобы запросить рекомендацию для конкретного пользователя, можно воспользоваться простым Ruby-скриптом (см. листинг 6). Пользователи и список элементов заранее заданы в базе данных easyrec. В листинге 6 специфицирована Ruby-функция для взаимодействия с удаленным веб-сервисом. Эта функция создает URL-адрес, который представляет запрос в easyrec (в этом случае требуется команда recommendationsforuser).

Листинг 6. Ruby-функция для взаимодействия с easyrec с целью получения рекомендации
#!/usr/bin/ruby

require 'rubygems'
require 'json'
require 'net/http'

def recommend_for_user( userid )

  puts "Request for recommendations for user #{userid}"

  apikey = "3d66b20f7cbf176bf182946a15a5378e"

  request = "http://intralife.researchstudio.at:8080" +
            "/api/1.0/json/recommendationsforuser?" +
            "apikey=#{apikey}&" +
            "tenantid=EASYREC_DEMO&" +
            "userid=#{userid}&" +
            "requesteditemtype=ITEM"

  resp = Net::HTTP.get_response(URI.parse(request))

  parsed = JSON.parse(resp.body)

  parsed2 = parsed['recommendeditems']

  parsed2['item'].each do |item|
    puts item['description']
  end

end

Как показано в Листинге 6, в дополнение к пространству имен REST и команде мы определяем следующие артефакты:

  • apikey (использование демонстрационного ключа с веб-сайта easyrec)
  • tenantid
  • Идентификатор пользователя, представляющего интерес в качестве субъекта для рекомендации

Вы также указываете, что вас интересует тип ITEM (чтобы разрешить все рекомендованные продукты). При наличии заданного URI-идентификатора (Uniform Resource Identifier) вы используете API-интерфейс Ruby-клиента Net:HTTP для отсылки запроса и для возвращения и сохранения ответа. Этот ответ подвергается синтаксическому разбору, после чего осуществляется итеративное прохождение по каждому возвращенному продукту.

В листинге 7 на примере конкретного пользователя демонстрируется использование функции recommend_for_user() внутри оболочки IRB (Interactive Ruby Shell). В данном случае рекомендации заключаются в выборе музыкальных произведений на основе предпочтений данного пользователя.

Листинг 7. Использование easyrec для формирования рекомендации
irb(main):027:0> recommend_for_user( "24EH1723322222A3" )
Request for recommendations for user 24EH1723322222A3
Beastie Boys - Intergalactic
Gorillaz - Clint Eastwood
irb(main):028:0>

Листинг 7 демонстрирует простоту интерфейса механизма easyrec. Этот интерфейс можно реализовать на любом языке, который поддерживает HTTP-клиент и синтаксический анализатор для XML или для JSON.


Другие предложения с открытым исходным кодом

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

LensKit

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

Crab

Crab — это инфраструктура рекомендательного механизма для Python, в которой используются некоторые составляющие экосистемы Python для вычислений научного характера, такие как NumPy и SciPy. В Crab реализована коллаборативная фильтрация на основе пользователей и на основе элементов. В рамках будущего развития проекта Crab запланирована реализация алгоритма Slope One и алгоритма сингулярного разложения (Singular Value Decomposition), а также применение API-интерфейсов типа REST.

MyMediaLite

MyMediaLite — это компактная библиотека с несколькими алгоритмами для рекомендательных систем, позволяющая создавать рекомендательные механизмы. В MyMediaLite реализовано прогнозирование рейтингов и прогнозирование элементов на основе обратной связи от пользователя по ранжированию элементов. Эта библиотека реализована на языке C# и предназначена для исполнения на платформе Microsoft.NET (или на платформе Mono в среде Linux®).

Waffles

Waffles — это написанный на языке C++ инструментарий машинного обучения, автором которого является Майк Гашлер (Mike Gashler) из Университета им. Бригама Янга. Waffles предлагает комплект инструментов на базе интерфейса командной строки. Эти инструменты реализуют мелкомодульные задачи из области машинного обучения, включая формирование рекомендаций, и таким образом поддерживают возможность написания скриптов для задач машинного обучения на более высоком уровне, чем требуется для интеграции API-интерфейса. Благодаря наличию в задачах Waffles большого количества параметров этот инструментарий позволяет точно настраивать работу системы в соответствии с выполняемой задачей.

Duine

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

Recommenderlab

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

Другие предложения

В сфере решений с открытым исходным кодом имеется несколько других предложений, которые можно использовать в качестве среды разработки для построения и оценки алгоритмов. Shogun — это инструментарий машинного обучения, ориентированный на крупномасштабные ядерные методы (такие как метод опорных векторов) в сочетании со многими другими методами и моделями. Milk – это инструментарий машинного обучения для Python, ориентированный на методы контролируемой классификации (SVM, k-NN и т. д.). И, наконец, Weka – это программное обеспечение для углубленного анализа данных, написанное на языке Java.


Заключение

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

Ресурсы

Научиться

  • Оригинал статьи: Recommender systems, Part 2: Introducing open source engines.
  • "A Survey of Collaborative Filtering Techniques" (Xiaoyuan Su and Taghi M. Khoshgoftaar, Advances in Artificial Intelligence, 2009): углубленное введение в алгоритмы коллаборативной фильтрации, включая алгоритмы типа Top-N на основе пользователей и на основе элементов.
  • A Tutorial on Clustering Algorithms: учебное пособие по алгоритмам на основе k-среднего с примерами и обсуждениями.
  • k-means clustering: статья Википедии по алгоритму k-средних с многочисленными ссылками на реализации и визуальные представления.
  • Recommender Systems: сайт с информацией о рекомендательных системах из широкого диапазона источников.
  • SUGGEST: дополнительная информация об этой простой, но эффективной библиотеке для разработки механизмов коллаборативной фильтрации на основе пользователей и на основе элементов (на языке С).
  • Top-N recommendation algorithms: дополнительная информация об алгоритмах типа Top-N.
  • easyrec: на веб-сайте проекта easyrec можно узнать подробнее об этом рекомендательном механизме, представляемом в виде веб-сервиса.
  • Чтобы узнать подробнее о представленных в этой статье инструментах и решениях с открытым исходным кодом для построения рекомендательных систем, посетите следующие сайты:
  • Чтобы узнать подробнее о программном обеспечении с открытым исходным кодом для углубленного анализа данных и для машинного обучения, посетите следующие сайты:
  • The Раздел Open source на сайте developerWorks — к вашим услугам обширный ассортимент справочной информации, инструментов и обновлений, который поможет осуществлять разработки на основе технологий с открытым кодом и использовать их вместе с продуктами IBM.

Обсудить

  • Присоединяйтесь к сообществу My developerWorks . Связывайтесь с другими пользователями developerWorks и знакомьтесь с ориентированными на разработчиков форумами, блогами, группами и вики-ресурсами.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Web-архитектура
ArticleID=970015
ArticleTitle=Рекомендательные системы: Часть 2. Механизмы с открытым исходным кодом
publish-date=04292014