- 追加された行はこの色です。
- 削除された行はこの色です。
[[FrontPage]]
#contents
2010/01/19からのアクセス回数 &counter;
** Tasteについて [#q4fdb91a]
Tasteは、mahoutに含まれるレコメンドシステム用パッケージです。
mahout ver. 0.20のTasteは、まだMapReduce(hadoup)に対応して
mahout ver. 0.20のTasteは、まだMapReduce(hadoop)に対応して
いないので、hadoupをインストールしなくても使用することができます。
** 準備 [#i2a788fa]
mahoutでの開発には、JDK 1.6が必要です。
*** Mac OS X (Leopard以降)でJDK 1.6を使う方法 [#kd7548af]
ネット検索するとOS XでJDK 1.6を使うには、アプリケーションのユーティリティフォルダにある
Java Preferencesで切り替えるとありますが、これを実施してもターミナルでjavac -versionが1.6に
切り替わりません。
そこで、以下の設定を.profileに追加します。
#pre{{
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export PATH=$JAVA_HOME/bin:$PATH
}}
新しいターミナルを起動して、設定が正しくできたか確認します。
#pre{{
$ javac -version
javac 1.6.0_15
}}
** レコメンド・アプリケーションの作成 [#jf267c14]
*** プロジェクトの作成 [#pd53abc7]
mavenを使ってレコメンド・アプリケーションを作成します。
最初に、プロジェクトを作成します。
#pre{{
$ mvn archetype:create -DgroupId=sample.recommendApp -DartifactId=recommendApp -Dversion=0.0.1
}}
*** pomファイルの変更 [#o6606cd4]
pom.xmlのdependecyに以下の項目を追加します。
#pre{{
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>
}}
また、JDKを1.6にするために以下のbuildを追加します。
#pre{{
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
}}
これで、&ref(pom.xml); の設定は完了です。
*** Eclipseのプロジェクトとしてインポート [#s711b2fc]
Eclipseを使って編集ができるように、以下のコマンドでEclipseのプロジェクトにします。
#pre{{
mvn eclipse:eclipse -DdownloadSources=true
}}
これで、必要なライブラリがすべてセットされ、ソースの参照も可能なEclipseプロジェクト
のできあがりです。
Eclipseで作成したrecommendAppをインポートしてください。
*** 最初のレコメンドアプリケーション [#wa964c85]
[[集合知>図書/集合知]]の2章のデータを使って、ユークリッド距離によるレコメンドアプリケーション
を作成してみましょう。
プログラムのメインは、以下のようになります。
#pre{{
// モデル構築用のデータをファイルから読み込む
DataModel model = new FileDataModel(new File("data/critics.csv"));
// ユーザ類似性と類似ユーザ抽出のメソッドを決定
UserSimilarity similarity = new EuclideanDistanceSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
similarity, model);
// ユーザベースの推薦を作成
Recommender recommender = new GenericUserBasedRecommender(model,
neighborhood, similarity);
// Toby(ユーザID=7)への推薦項目を3個検索
List<RecommendedItem> recommendations = recommender.recommend(7, 3);
// 推薦結果を出力
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
}}
以下のテストデータとjavaのプログラムがあります。
- &ref(App.java);
- &ref(critics.csv);
*** 実行結果 [#v2c64f3a]
プログラムを実行すると以下のように出力されます。
#pre{{
10/01/19 19:24:39 INFO file.FileDataModel: Creating FileDataModel for file data/critics.csv
10/01/19 19:24:39 INFO file.FileDataModel: Reading file info...
10/01/19 19:24:39 INFO file.FileDataModel: Read lines: 35
10/01/19 19:24:39 INFO model.GenericDataModel: Processed 7 users
RecommendedItem[item:6, value:3.741911]
RecommendedItem[item:1, value:3.0]
RecommendedItem[item:3, value:2.4946072]
}}
推薦の結果は、最後の2行です。ItemIdを映画の名前にすると
- Item:6→ The Night Listener
- Item:1→ Lady in the Water
- Item:3→ Just My Luck
となり、Tobyがまだ見ていない映画のなかから、Tobyと似た嗜好をもつユーザの
好きな映画がリストアップされます。
この結果は、「集合知」2.4の結果とスコアは異なりますが順序は一致します。
#pre{{
# 集合知の出力
>>>recommendations.getRecommendations(recommendations.critics,'Toby',
... similarity=recommendations.sim_distance)
[(3.5002478401415877, 'The Night Listener'), (2.7561242939959363, 'Lady in the
Water'), (2.4619884860743739, 'Just My Luck')]
}}
** コメント [#kc9b000c]
#vote(おもしろかった,そうでもない,わかりずらい)
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha