[[FrontPage]] #contents 2010/01/19からのアクセス回数 &counter; ** Tasteについて [#q4fdb91a] Tasteは、mahoutに含まれるレコメンドシステム用パッケージです。 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