- 1列目 - おすすめしている人のID
- 2列目 - おすすめしているアイテムのID
- 3列目 - 嗜好の度合い(いくつでもいい?)
例えば次のような場合、1行目はユーザーIDが1の人が、アイテム番号100を気に入っており、その度合いが5を表しています。
1,100,5
1,200,3
1,300,3
2,100,5
2,200,5
2,400,3
2,900,4
3,200,4
3,300,5
3,700,4
4,200,5
4,400,4
4,600,5
4,900,5
5,100,5
5,200,3
5,400,4
5,500,6
5,700,5
6,100,3
6,200,4
6,400,2
6,700,3
7,100,4
7,700,5
7,800,5
7,900,5
列はどれも数値にする必要があります。現状持っているデータのユーザーIDなどが文字列の場合は変換テーブルを作って数値を割り振るような対応になるんでしょうね。
データが準備できたら以下のコマンドを使って早速計算をしてみます。
bin/mahout recommenditembased -i recommend.txt -o recommend_out -s SIMILARITY_PEARSON_CORRELATION
ここの環境だと計算に10秒近くかかりました。
結果は引数で指定したrecommend_outフォルダのファイルpart-r-00000に記録されます。 今回のサンプルの結果だと以下のようになります。各行がそれぞれのユーザーへのおすすめを示しており、1行目はユーザーIDが2の人へのおすすめはアイテム番号700で、スコアが3.9172406というのを示しているようです。
vmplanet@ubuntu:~/mahout-distribution-0.9$ cat recommend_out/part-r-00000
2 [700:3.9172406]
4 [700:4.19286]
5 [900:4.375]
6 [900:2.375]
7 [400:4.6099067]
数字だけ見ていると合っているのかはピンときませんが、一応レコメンドが計算できたようです。
vmplanet@ubuntu:~/mahout-distribution-0.9$ ls -l recommend_out/
合計 4
-rwxrwxrwx 1 vmplanet vmplanet 0 2014-09-18 20:33 part-r-00000
-rwxrwxrwx 1 vmplanet vmplanet 0 2014-09-18 20:33 _SUCCE
正確にはわかりませんが、元データが20行くらいになると結果が出てくるようです。
14/09/18 20:43:26 WARN mapred.LocalJobRunner: job_local1173485433_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.mahout.cf.taste.hadoop.item.ItemIDIndexMapper.map(ItemIDIndexMapper.java:50)
データを変更して再度計算しようと思いコマンドを再実行したところ以下のエラーとなりました。
14/09/18 20:35:35 ERROR security.UserGroupInformation: PriviledgedActionException as:vmplanet cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory temp/preparePreferenceMatrix/itemIDIndex already exists
出力先で指定したフォルダと、計算途中でできたtempフォルダがあるとエラーになるので、実行前には以下のコマンドできれいにしてから実行するといいでしょう。
rm -rf temp/ recommend_out/