[[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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc