mahoutを使って協調フィルタリングを実行してみる

機械学習ライブラリの「Apache Mahout」を使って、
簡単にWindows機のeclipse上に協調フィルタリング(CF)の環境を整える。

ある程度環境が事前に整っていれば、30分で構築可能。

                                                                                                                  • -

1. eclipseについて

4.3 ultimate が良いが 3.7 Java Developer 以上なら問題ないはず。
要はMavenが元々入ってるeclipseを使うべき。

入ってるかどうかは後の「手順4」でうまくいかないのであれば、
eclipseを入れ直すべき。

                                                                                                                  • -

2. javaのbuild path

eclipse上のjavaはどのライブラリで走るかによるが注意が必要。
念の為、コマンドプロンプトで「java -version」「java -verbose」で
Java7(java1.7)64bitでbuild pathの位置を確認した。

mahoutだけなら問題ないそうだが、hadoopを入れる際は、
どうも「Program Files」などフォルダにスペースが入るような場所に
Javaライブラリがあると参照出来ないようなので、
念の為に「c:\java\java1.7\」にインストールし直した

                                                                                                                  • -

3. mahoutのsrcをdownload

mahout official release の0.8 srcをzipでダウンロードすればいいんじゃね、
と思いダウンロードしたらうまくいったのでコレでいいはず。

mahout-distribution-0.8-src.zip
http://ftp.riken.jp/net/apache/mahout/0.8/mahout-distribution-0.8-src.zip

あらゆるサイトにcygwinを入れろとかコマンドプロンプトになんかしろとか
eclipse用のフォルダをコマンドで生成しろとかどーでもいい。

                                                                                                                  • -

4. eclipseにprojectを立てる

javaプロジェクトじゃなくて、mavenプロジェクトを立てる必要がある。

パッケージエクスプローラ→新規→その他→「mavenプロジェクト」
「シンプルなプロジェクトの作成」→「次へ」
「グループidとアーティファクトidを適当に入れる」ex. mahout

                                                                                                                  • -

4.5. mahoutにbuild pathを通す

maven project直下にdownloadしたmahoutを置く(もちろんzip解凍後に)
その後「ビルドパスの追加」「クラス・フォルダーの追加」で置いたmahoutを選んでbuild pathを通す
(12/10 8:15 追記)

                                                                                                                  • -

5. eclipse projectのpom.xmlを編集する

versionの下に以下を追加すればよい。
注意するのはmahoutパッケージのversionと合わせないとエラーを吐く。
上記で「0.8」をdownloadしたので、0.8と入力。


以下は追加する必要がありそうな一部


org.apache.mahout
mahout-core
0.8


org.apache.mahout
mahout-math
0.8


org.apache.mahout
mahout-examples
0.8


                                                                                                                  • -

6. sampleデータを用意する

src/main/resourcesの下にdata.csvとなるデータを入れる

1,101,1.5
1,102,4.5
1,103,2.5
1,104,2.5
1,105,1.0
2,101,2.0
2,102,3.5
2,103,3.0
2,104,2.5
2,105,3.0
2,106,4.0
3,101,2.5
3,104,3.0
3,105,5.0
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
4,107,1.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,5.0
5,105,3.5
5,106,1.0
6,101,2.0
6,102,4.0
6,103,1.0
6,104,5.0
6,105,3.5
6,106,1.0

                                                                                                                  • -

7. 実行javaプログラムを用意する

src/main/javaの下にMahoutSample.javaを用意する。

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

import org.apache.mahout.cf.taste.common.TasteException;
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 MahoutSample {

/**
* Mahoutの簡単なサンプル 1番のユーザに対するレコメンドを1つだけ出力します。
*
* @param args
*/
public static void main(String[] args) {
try {
// データの取り込み
DataModel dataModel = new FileDataModel(new File(
"src/main/resources/data.csv"));
// 相関性の評価基準の設定
UserSimilarity similarity = new PearsonCorrelationSimilarity(
dataModel);
// 評価の近い人を探すロジックを決めてる?
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3,
similarity, dataModel);
// レコメンダの作成
Recommender recommender = new GenericUserBasedRecommender(
dataModel, neighborhood, similarity);

// 1番の人に対するレコメンドが1つ
List recommendations = recommender.recommend(1, 1);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}

System.out.println("end");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TasteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

                                                                                                                  • -

8. 実行する

実行結果は以下のように出るはず

12 10, 2013 7:28:23 午前 org.slf4j.impl.JCLLoggerAdapter info
情報: Creating FileDataModel for file src\main\resources\data.csv
12 10, 2013 7:28:23 午前 org.slf4j.impl.JCLLoggerAdapter info
情報: Reading file info...
12 10, 2013 7:28:23 午前 org.slf4j.impl.JCLLoggerAdapter info
情報: Read lines: 32
12 10, 2013 7:28:23 午前 org.slf4j.impl.JCLLoggerAdapter info
情報: Processed 6 users
RecommendedItem[item:106, value:3.9137328]
end

                                                                                                                  • -

▼自分の完成ファイル群はこちら
https://github.com/lanevok/Study/tree/master/mahout/cf_sample
(12/10 8:46追記)

▼Mahout in Actionのサンプルコードはこちらにある
https://github.com/tdunning/MiA/tree/master/src/main/java/mia/recommender
(2013/12/15 17:18追記)

※参考になったサイトは以下
http://www.mwsoft.jp/programming/mahout/install.html
 →hadoopインストールなんて不要です,mavenプロジェクトの立て方が参考に,pom.xmlの記述方法が参考に
  レコメンドのデータとソースコードは参考にせず,mahoutをコマンドから実行することはいらないので参考にならず
http://d.hatena.ne.jp/celitan/20110310/1299770999
 →mahoutいれてmavenプロジェクトさえ立てば、あとはこのサイトだけで済む