FrontPage

2010/01/19からのアクセス回数 21212

Tasteについて

Tasteは、mahoutに含まれるレコメンドシステム用パッケージです。

mahout ver. 0.20のTasteは、まだMapReduce(hadoop)に対応して いないので、hadoupをインストールしなくても使用することができます。

準備

mahoutでの開発には、JDK 1.6が必要です。

Mac OS X (Leopard以降)でJDK 1.6を使う方法

ネット検索するとOS XでJDK 1.6を使うには、アプリケーションのユーティリティフォルダにある Java Preferencesで切り替えるとありますが、これを実施してもターミナルでjavac -versionが1.6に 切り替わりません。

そこで、以下の設定を.profileに追加します。

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export PATH=$JAVA_HOME/bin:$PATH

新しいターミナルを起動して、設定が正しくできたか確認します。

$ javac -version
javac 1.6.0_15

レコメンド・アプリケーションの作成

プロジェクトの作成

mavenを使ってレコメンド・アプリケーションを作成します。

最初に、プロジェクトを作成します。

$ mvn archetype:create -DgroupId=sample.recommendApp -DartifactId=recommendApp -Dversion=0.0.1

pomファイルの変更

pom.xmlのdependecyに以下の項目を追加します。

    </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を追加します。

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

これで、filepom.xml の設定は完了です。

Eclipseのプロジェクトとしてインポート

Eclipseを使って編集ができるように、以下のコマンドでEclipseのプロジェクトにします。

mvn eclipse:eclipse -DdownloadSources=true

これで、必要なライブラリがすべてセットされ、ソースの参照も可能なEclipseプロジェクト のできあがりです。

Eclipseで作成したrecommendAppをインポートしてください。

最初のレコメンドアプリケーション

集合知の2章のデータを使って、ユークリッド距離によるレコメンドアプリケーション を作成してみましょう。

プログラムのメインは、以下のようになります。

		// モデル構築用のデータをファイルから読み込む
		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のプログラムがあります。

実行結果

プログラムを実行すると以下のように出力されます。

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を映画の名前にすると

となり、Tobyがまだ見ていない映画のなかから、Tobyと似た嗜好をもつユーザの 好きな映画がリストアップされます。

この結果は、「集合知」2.4の結果とスコアは異なりますが順序は一致します。

# 集合知の出力
>>>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')]

コメント

選択肢 投票
おもしろかった 0  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

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