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

Mahout:サンプル1:はじめてのレコメンド のバックアップ(No.1)


Mahout:環境構築

Mahout:サンプル1:はじめてのレコメンド

Mahoutを使った初めてのレコメンドです。

まあ、Mahout本に記載されているサンプルを実行してるだけですがw

※Mahout本にはimportするクラスとか書いてないけど、きっとサンプルソースはコーディングせずにDLして使ってね!ってことなんだよねw それとも、それぐらい解決できない人はそもそも対象外ですよ、ってことなのかなw

サンプルコード

うだうだ長いですが、端的には

  • DataModel?にデータを食わせて
  • Simirarityを計算させて
  • Neighborhoodを計算させて
  • そいつらを元にRecommenderを生成して
  • RecommenderにレコメンドするユーザID(1)と提示(レコメンデーション)させるアイテム数(1)を渡しているってことです。

RecommenderIntro?.java

package test1;

import java.io.File;
import java.util.List;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;


public class RecommenderIntro {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		DataModel model = new FileDataModel(new File("data/data1/intro.csv"));
		
		UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
		
		UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
		
		Recommender recommender = new GenericUserBasedRecommender(
				model, neighborhood, similarity);
		
		List<RecommendedItem> recommendations = recommender.recommend(1, 1);
		
		for (RecommendedItem recommendation : recommendations){
			System.out.println(recommendation);
		}
	}
}

サンプルで使用するデータは「data/data1/intro.csv」としてます。

■data/data1/intro.csv

1,101,5.0
1,102,3.0
1,103,2.5

2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0

3,101,2.5
3,104,4,5
3,105,4.5
3,107,5.0

4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0

5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0

して、サンプルの実行結果は以下のとおり。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mahout1/lib-mahout/lib/slf4j-jcl-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mahout1/lib-mahout/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
13/04/12 22:49:17 INFO file.FileDataModel: Creating FileDataModel for file data/data1/intro.csv
13/04/12 22:49:17 INFO file.FileDataModel: Reading file info...
13/04/12 22:49:17 INFO file.FileDataModel: Read lines: 21
13/04/12 22:49:17 INFO model.GenericDataModel: Processed 5 users
RecommendedItem[item:104, value:4.257081]

ほっほー、とりあえず、結果が出力されましたw

結果としては、「ユーザ1に1つアイテムをレコメンドせい」という要求に対して「104ってやつがスコア4.26でおすすめです」と言うことですな。

じゃあ、レコメンドさせるアイテムを2にすると以下のようになります。

ソース上のここ

List<RecommendedItem> recommendations = recommender.recommend(1, 1);

List<RecommendedItem> recommendations = recommender.recommend(1, 2);

に修正して実行!っと。するとこんな感じです。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mahout1/lib-mahout/lib/slf4j-jcl-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mahout1/lib-mahout/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
13/04/12 23:21:42 INFO file.FileDataModel: Creating FileDataModel for file data/data1/intro.csv
13/04/12 23:21:43 INFO file.FileDataModel: Reading file info...
13/04/12 23:21:43 INFO file.FileDataModel: Read lines: 21
13/04/12 23:21:43 INFO model.GenericDataModel: Processed 5 users
RecommendedItem[item:104, value:4.257081]
RecommendedItem[item:106, value:4.0]

なるほど、2つのアイテムがレコメンドされた!そりゃあそうかw