レコメンダー・システム: 第 2 回 オープンソース・エンジンの紹介

おすすめ機能を構築するためのソフトウェアについて探る

この連載の第 1 回では、レコメンデーション・エンジンを構築するための基本的な手法とアルゴリズムについて紹介しました。連載を締めくくる今回は、レコメンダー・システムを構築するためのオープンソースのソリューションをいくつか紹介するとともに、2 つのオープンソース・ソリューションを実際に使用する方法を説明します。また、単純なクラスタリング・アプリケーションを Ruby で作成し、そのアプリケーションをサンプル・データに適用する方法についても説明します。

M. Tim Jones, Independent author, .

M. TIm JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』や『AI Application Programming』、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。彼はコロラド州ロングモン在住で、Intel に勤務するプラットフォーム・アーキテクトです。



2014年 1月 16日

この連載の第 1 回では、レコメンダー・システムに使用される代表的な手法と特定のアルゴリズムをいくつか説明しました。今回は、レコメンデーション・エンジンについての説明から始め、レコメンダー・システムを構築するためのいくつかのオープンソース・ソリューションの紹介、単純なクラスタリング・アプリケーションを Ruby で作成し、そのアプリケーションを第 1 回のサンプル・データに適用する方法についての説明と続きます。次に、似たようなアルゴリズムを実装しながらも、著しく異なる手法を使用する 2 つのオープンソース・エンジンを試します。最後に、レコメンダー、機械学習、データ・マイニングに使用できる、他のオープンソース・ソリューションの概要を説明します。

レコメンデーション・エンジンは、あるサービスに対する一連のユーザーの振る舞いに関するデータに基づいて動作します。ほとんどの場合、レコメンデーション・エンジンを利用したサービスは、個々のアイテムを多数のユーザーに公開し、それらのアイテムに対するユーザーの振る舞い (アイテムの閲覧、購入、評価など) を追跡する Web サイトです。この種のデータは、ユーザー・ベースまたはアイテム・ベースの協調フィルタリングを使用するレコメンデーション・エンジンの基本要件を形成します。

図 1 は、レコメンダー・システムの単純なエコシステムを示しています。このエコシステムは、以下の要素で構成されています。

  • 少数のユーザーの集合
  • サービス
  • サービス内で個々のユーザーの振る舞い (購入や閲覧など) を識別する機能
  • 成果物としておすすめを導出して格納するレコメンデーション・エンジン
図 1. レコメンダー・システムの単純なエコシステム
レコメンダー・システムの単純なエコシステムを説明する図

次に、Ruby を使用した単純なクラスタリングの実装を紹介します。この実装はユーザーの個々の振る舞いを基に、似たようなユーザーをグループ化します。

ユーザー・ベースの協調フィルタリングを行うためのクラスタリング

第 1 回で、4 人のユーザーからなる単純な集合におけるユーザー・ベースの協調フィルタリングについて説明したことを思い出してください。ある集合におけるおすすめを紹介するには、最初にユーザーの振る舞いに基づいてユーザーを分類する必要があります。この最初の例では、単純なアルゴリズムである K-means (K 平均) 法によるユーザーの分類について説明しました。

第 1 回を読むとわかるように、K-means 法は複数のアイテムを k 個のクラスターに分割しますが、最初はそれをランダムに行います。次にクラスター・メンバーの関数として各クラスターのセントロイドを計算します。そして、クラスターのセントロイドから各アイテムまでの距離を調べます。現在配置されているクラスターよりも別のクラスターの方が近いと判断されたアイテムは、そのクラスターに移動されます。すべてのアイテムについて調べるたびに、セントロイドが再計算されます。この動作を繰り返しても移動されるアイテムがなくなると、このアルゴリズムは終了します。

図 2 に、いくつかのブログを読んでいる 4 人のユーザーに関するデータ・セットの例を示します。

図 2. ブログを読んでいるユーザーの振る舞いに関するサンプル・データ
ブログを読んでいるユーザーの振る舞いに関するサンプル・データを示す図

リスト 1 に、K-means 法アルゴリズムのクラスターを表す Cluster クラスを Ruby で実装したコードを示します。

リスト 1. Ruby で作成された Cluster クラス
class Cluster

  # Initialize the class instance
  def initialize
    @people = Array.new
    @vcentroid = Hash.new( "0" )
  end

  # Add a feature vector to the cluster
  def add( person )
    @people.push( person )
  end

  # Remove a feature vector from the cluster
  def remove( person )
    @people.delete( person )
  end

  # Return the cluster centroid
  def get_people
    return @people
  end

  # Calculate the centroid vector from the cluster members
  def calculate_centroid

    # Clear the centroid vector
    @vcentroid.clear
    tcentroid = Hash.new( "0" )

    # Iterate through each feature vector
    @people.each do |person|

      # Sum the feature vectors in this cluster
      person.each do |key,value|
        tcentroid[key] = tcentroid.delete(key).to_i + value.to_i
      end

    end

    # Compute the average for the centroid
    tcentroid.each do |key,value|
      @vcentroid[key] = value.to_f / @people.length
    end

  end

  # Calculate the geometric distance
  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 メソッドは配列とハッシュの両方を作成します。

クラスターのメンバーを操作するためのメソッドは、以下の 3 つです。

  • add メソッドはクラスターに person を追加します。
  • remove メソッドは person を削除します。
  • get_people メソッドは配列を抽出し、繰り返し操作を行えるようにします。

クラスターを操作するためのメソッドは 2 つあります。calculate_centroid メソッドは、現在のメンバーに基づいてクラスターの中心を更新します。calculate_gd メソッドは、クラスターのセントロイドと渡された person オブジェクトとの間のユークリッド距離を返します。

リスト 2 に、図 2 のサンプル・データを基に動作する K-means 法を Ruby で実装したコードを示します。

リスト 2. 基本的な K-means 法アルゴリズムを実装する
def kmeans

  # Sample user hashes
  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' }

  # Define our two clusters and initialize them with two users
  cluster1 = Cluster.new
  cluster1.add(marc)
  cluster1.add(megan)

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

  changed = true

  # Repeat until no further membership changes occur
  while changed do

    changed = false

    # Recalculate each cluster's centroid (mean)
    cluster1.calculate_centroid
    cluster2.calculate_centroid

    # Get the membership of each cluster
    people1 = cluster1.get_people
    people2 = cluster2.get_people

    # Check members of cluster 1 against the cluster centroids
    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

    # Check members of cluster 2 against the cluster centroids
    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 ではまず、クラスターにサンプル・データを追加します。次に、各クラスターのセントロイドを (クラスターのメンバーの平均として) 計算した後、2 つのクラスターから各メンバーまでの距離を調べます。あるメンバーが、そのメンバーが現在配置されているクラスターのセントロイドよりも他方のクラスターのセントロイドに近い場合には、そのメンバーは元々配置されているクラスターから削除され、他方のクラスターに追加されます。すべてのメンバーに対して調べたら、セントロイドを再計算し、すべてのメンバーについてセントロイドからの距離を確認します。変化が生じなくなると、このアルゴリズムは終了します。

サンプル・ユーザーを k = 2 のクラスターにクラスタリングするために、リスト 3 のコンソール・セッションに示す kmeans メソッドを呼び出します。

リスト 3. 単純な K-means 法の実装を実行する
$ 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 

$

このアルゴリズムにより、Marc と Elise はクラスター 1 へ、Megan と Jill はクラスター 2 へとクラスタリングされます。クラスタリングが完了すると、レコメンデーション・エンジンはクラスターのメンバー間の違いを利用しておすすめを作成することができます。

おすすめ機能を構築するためには、必ずしも自分でアルゴリズムを作成する必要はありません。この後のセクションでは、2 種類のオープンソース・レコメンデーション・エンジンについて詳しく説明し、その他のオープンソース・ソリューションのいくつかについても簡単に説明します。


SUGGEST と Top-N によるおすすめ機能

SUGGEST は、ライブラリーとして実装された Top-N レコメンデーション・エンジンです。(ミネソタ大学の George Karypis 氏が開発した) SUGGEST は、いくつかの協調フィルタリング・アルゴリズムを使用して、ユーザー・ベースおよびアイテム・ベースの協調フィルタリングを実装しています。アルゴリズムの指定は、使用するデータ・セットの初期化の際に行うことができます。

アイテムに対するユーザーの一連の操作を通じて、SUGGEST にデータが提供されます。この記事で紹介する例では、データは各ユーザーが読んだブログ記事の数を表します。より正確なモデルでは、ユーザーが過去に読んだ特定の記事の数など、ユーザーによる個々の操作の履歴が提供されます。ここではデータは単純なままとするため、これまでのデータ・セット (4 人のユーザーと 5 種類のブログ) を使用することにします。

SUGGEST は、単純な API を公開しています。以下の 3 つの関数を使用するだけで、C 言語でレコメンデーション・エンジンを構築することができます。

  • SUGGEST_Init は、操作の履歴をロードし、特定のレコメンデーション・アルゴリズムを定義して、レコメンデーション・インスタンスを初期化します。
  • SUGGEST_TopN は、渡されたサンプル・データを基におすすめを導出します。
  • SUGGEST_Clean は、SUGGEST_Init によって作成されたレコメンデーション・エンジン・インスタンスを解放します。

4 番目の関数、SUGGEST_EstimateAlpha は、(確率ベースのアルゴリズムを使用する場合に) アルゴリズム用に最適アルファ値を定義します。

リスト 4 に、SUGGEST を使用した単純なおすすめ機能の実装を示します。

リスト 4. SUGGEST レコメンデーション・エンジンを使用する (C で作成された) サンプル・アプリケーション
#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

// Historical transactions of users and items.
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] =
  { /* Marc Blog Reads */
    LINUX1, LINUX2, LINUX3, LINUX4, OSS1, OSS3, CLOUD2, CLOUD4, JAVA3,

    /* Megan Blog Reads */
    LINUX4, OSS1, CLOUD1, CLOUD2, JAVA1, JAVA2, JAVA3, JAVA4, AGILE1, AGILE2,

    /* Elise Blog Reads */
    LINUX1, LINUX3, LINUX4, OSS2, OSS3, CLOUD1, CLOUD2, JAVA4, AGILE3,

    /* Jill Blog Reads */
    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 では、使用する履歴データを 2 つの配列 (useriditemid) に定義することから始めています。この 2 つの配列は、user [index] によってアイテムに対するユーザーの操作 (userid[0]itemid[0] を購入した、など) を定義することで、関連付けられています。簡単かつ読みやすくするために、この 2 つの配列はユーザー、アイテムの順で定義されています。

リスト 4 の中にある簡単な main 関数の中で SUGGEST ソリューションが使用されています。そこではまず、ユーザーとアイテムからなるサンプル・データ (データ全体で、複数のユーザーが一連のアイテムに対して行った操作を表します) でレコメンダーを初期化します。そのために、userid 配列と itemid 配列をそれらの上限および取り得る値 (ユーザーおよびアイテムの ID) とともに引数として渡して SUGGEST_Init を呼び出します。また、アイテム・ベースの Top-N レコメンデーション・アルゴリズム (コサイン・ベースの類似度関数を使用したユーザー・ベースの Top-N アルゴリズム) と、レコメンデーション用に似通った集合のサイズを指定します。次に、レコメンデーション・リクエストを導出するためにアイテムを「買い物かご」に入れ、SUGGEST_TopN を呼び出してレコメンデーションをリクエストします。最後に、レコメンダーに関連付けられたリソースを解放して終了します。この例の Web サイトでは、5 種類のトピックについて 20 本の記事を公開しており、4 人のユーザーに関して履歴データがあることに注意してください。

サンプルの SUGGEST レコメンダーを実行した場合のコンソール・セッションをリスト 5 に示します。

リスト 5. サンプル・データを使用して SUGGEST レコメンデーション・エンジンを実行する
$ ./topn
Recommendations (2) are 2 and 8
$

この場合、SUGGEST レコメンデーション・エンジンは、この特定の読者が LINUX3 と CLOUD2 を読んでみることをおすすめします。このユーザーの過去の振る舞いと閲覧頻度を考えると、おすすめの内容は妥当なものです。SUGGEST_TopN を呼び出した結果として、レコメンデーション配列内におすすめのアイテムの番号が返されることに注意してください。

SUGGEST は単純ですが、Top-N 協調フィルタリング・アルゴリズムを効果的に実装しています。


RESTful な Web サービスと easyrec

オープンソースのレコメンデーション・エンジンである easyrec では、画期的な手法でおすすめサービスを構築します。(easyrec はオーストリア科学研究省 (Austrian Federal Ministry of Science and Research) が資金を提供している Research Studios Austria が開発および保守を行っています。)

easyrec は REST (REpresentational State Transfer) インターフェースを公開することにより、開発に使用される言語との完全な分離を実現しています。この方法により、エンド・ユーザー向けアプリケーションとサービスとの統合が容易になり、サービスのスケーラビリティーも高めることができます。

easyrec の API として公開されている豊富な RESTful インターフェースには、レコメンダー・システムに必要なアクションとして考え得るすべてのアクション (アイテムの購入、閲覧、評価など) が網羅されています。これらのアクションは easyrec のデータベースの中に記録されます。おすすめは、特定のインターフェース・セット (例えば、「選択した商品に関連する商品」、「他のユーザーはこんな商品も見ています」、「ユーザーへのおすすめ」、「他のユーザーも購入しています」など) として提供されます。これらの基本的なおすすめのアクションは、多くの予測シナリオに見られる一般的なケースの大部分をカバーしています。easyrec の API は、XML によるレスポンスと JSON によるレスポンスをどちらもサポートしています。

では easyrec を使用して、指定されたユーザーに対するおすすめをリクエストする例について説明します。easyrec によるソリューションは、ユーザー独自の設定がされているところに統合可能なパッケージとして提供されますが、テスト用として利用できるデモ・サーバーも用意されています。このサーバーと easyrec のテスト・データを使用して、おすすめをリクエストしてみましょう。

リスト 6 の単純な Ruby スクリプトを使用すると、指定されたユーザーに対するおすすめをリクエストすることができます。一連のユーザーとアイテムは easyrec のデータベースの中にあらかじめ定義されています。リスト 6 には、リモート Web サービスとやりとりするための Ruby 関数が定義されています。この関数により、easyrec に対するリクエストを表す URL を作成します。(この場合、リクエストされたコマンドは recommendationsforuser です。)

リスト 6. easyrec とのやりとりによっておすすめをリクエストする Ruby 関数
#!/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 の Web サイトにあるサンプル・キーを使用しています)
  • tenantid
  • おすすめの対象となるユーザーの ID

また、すべての商品をおすすめに含められるように、関心があるアイテム・タイプに ITEM を指定しています。URI (Uniform Resource Identifier) を定義したら、Ruby のクライアント API である Net:HTTP を使用してリクエストを送信し、受け取ったレスポンスを返して格納します。このレスポンスを構文解析した後、返された各アイテムに対して繰り返し処理を行います。

リスト 7 に、特定のユーザーに対して IRB (Interactive Ruby Shell) の中で recommend_for_user() 関数を使用する方法を示します。この場合はそのユーザーの好みに基づいて選択された音楽でおすすめが構成されています。

リスト 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 クライアントおよび JSON パーサーまたは XML パーサーを作成可能な任意の言語で実装することができます。


他のオープンソース・レコメンデーション・エンジン

ここまで紹介した以外にも、オープンソースのレコメンダー・ソリューションやソリューションの構成要素はいくつもあります。このセクションでは、それらの一部について説明します。(このセクションで取り上げるオープンソース・レコメンデーション・エンジンや、それ以外のエンジンについては、「参考文献」を参照してください。)

LensKit

(ミネソタ大学が開発した) LensKit は、レコメンダー・システムを構築するためのフレームワークであり、協調フィルタリングの研究によく使用されています。LensKit の目標は、コードが読みやすく Web アプリケーションに統合しやすい高品質の実装を実現することです。

Crab

Crab レコメンダー・エンジン・フレームワークは Python 用に作成されており、Python エコシステムの科学計算モジュールの一部 (NumPy や SciPy など) を利用しています。Crab は、ユーザー・ベースの協調フィルタリングとアイテム・ベースの協調フィルタリングを実装しています。このプロジェクトは、将来的にスロープ・ワン・アルゴリズムと特異値分解アルゴリズムを実装する計画であり、最終的には REST API を使用することも計画しています。

MyMediaLite

MyMediaLite は、いくつかのレコメンダー・システム用アルゴリズムからなる軽量ライブラリーであり、レコメンデーション・エンジンの開発に使用することができます。MyMediaLite は、ユーザーがアイテムを評価したレビューを基にして評価予測とアイテム予測を実装します。このライブラリーは Microsoft .NET プラットフォーム上で実行される C# で実装されています (Linux では Mono のサポートが使用されます)。

Waffles

Waffles は、ブリガム・ヤング大学 (Brigham Young University) の Mike Gashler 氏が C++ で開発した機械学習ツールキットです。Waffles は CLI ベースの一連のツールで構成されています。これらのツールによって、機械学習の細部の処理 (おすすめ動作など) が実装されるため、API を使用して統合する場合よりも上位レベルで機械学習の処理をスクリプト化することができます。Waffles では、実行可能な処理のためのパラメーターを多数設定できるため、対象とするタスクに合わせて動作を微調整することができます。

Duine

Duine は、ノルウェーの Telematica Instituut による予測エンジン開発用ソフトウェア・ライブラリーです。Duine では Java 言語を使用して、情報フィルタリングの他に協調フィルタリング技術を実装しています。このフレームワークが最後にコミットされたのは 2009年なので、このプロジェクトは現在はアクティブでないかもしれません。

Recommenderlab

Recommenderlab は、R 環境用に協調フィルタリングを拡張したものであり、レコメンダー・システムの研究、開発のための一般的なインフラストラクチャーです。Recommenderlab 環境では、アルゴリズムの開発および評価、そして複数のアルゴリズムの比較を容易に行うことができます。

その他

他にも、オープンソースの領域にはアルゴリズムの作成や評価のための開発環境として利用可能な選択肢がいくつもあります。Shogun 機械学習ツールボックスは、さまざまな手法やモデルに加え、大規模なカーネル法 (SVM (Support Vector Machine: サポート・ベクター・マシン) など) にフォーカスしています。Milk は Python 用の機械学習ツールキットであり、教師ありクラス分類法 (SVM、k-NN など) にフォーカスしています。Weka は Java プログラミング言語で作成されたデータ・マイニング・ソフトウェアです。


まとめ

Web の規模が拡大するにつれてパーソナライズ化への圧力も高まり、レコメンデーション・エンジンの分野には新しいアルゴリズムやリッチで多様なソリューションが次々と登場しています。協調フィルタリング・アルゴリズムを開発するための環境から、アルゴリズムを評価するためのフレームワークに至るまで、さらにはフル機能のソリューションに至るまで、オープンソースの領域にはさまざまなプログラミング言語による多種多様なプロジェクトがあります。

参考文献

学ぶために

  • A Survey of Collaborative Filtering Techniques」(Xiaoyuan Su、Taghi M. Khoshgoftaar 共著、Advances in Artificial Intelligence、2009年): ユーザー・ベースおよびアイテム・ベースの Top-N アルゴリズムをはじめとする協調フィルタリング・アルゴリズムを詳しく紹介したこの記事を読んでください。
  • A Tutorial on Clustering Algorithms」: 例と説明を通じて K-means (K 平均法) 法のアルゴリズムについて学んでください。
  • K 平均法: ウィキペディアで K 平均法のページを調べてください。このページには、さまざまな実装や視覚化へのリンクが含まれています。
  • レコメンダー・システム: このウィキにアクセスして、広範なソースからレコメンダー・システムについての情報を入手してください。
  • SUGGEST: C 言語でユーザー・ベースおよびアイテム・ベースの協調フィルタリングを開発するための単純ながらも効果的なこのライブラリーについて学んでください。
  • Top-N レコメンデーション・アルゴリズム: Top-N アルゴリズムについての詳細な説明を読んでください。
  • easyrec: easyrec プロジェクトのサイトにアクセスし、この Web サービス・ベースのレコメンデーション・エンジンについての詳細な情報を入手してください。
  • この記事で簡単に紹介しているオープンソースのレコメンダー・ツールおよびレコメンダー・ソリューションについて詳しく学ぶために、以下のサイトを調べてください。
  • データ・マイニングおよび機械学習のオープンソース・ソフトウェアについての詳細は、以下のサイトを調べてください。
  • developerWorks Open source テクニカル・トピックス: オープンソース技術を使用した開発や、オープンソース技術を IBM 製品とともに使用するのに役立つ広範なハウツー情報、ツール、およびプロジェクトの更新を見つけてください。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Web development
ArticleID=959863
ArticleTitle=レコメンダー・システム: 第 2 回 オープンソース・エンジンの紹介
publish-date=01162014