org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommenderを使う事で簡単にSlopeOneによる評価予測値を取得する事が出来る

データを作成

「ユーザーID,アイテムID,評価値」でデータを作成する。所々ユーザーが評価していないアイテムをSlopeOneを使用して評価予測を行う。以下のようなデータを作る

1,101,4.0
1,102,5.0
1,103,2.0
1,104,4.0
1,106,5.0

2,101,2.0
2,103,3.0
2,104,4.0
2,105,3.0

3,101,1.0
3,102,4.0
3,104,5.0
3,105,3.0
3,106,4.0

4,102,5.0
4,105,2.0
4,106,4.0

5,102,3.0
5,103,1.0
5,104,3.0
5,106,3.0

Client.javaを作成

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

import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.impl.model.FileDataModel;
import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;

public class Client {
    public static void main(String[] args) throws Exception {
        DataModel model = new FileDataModel(new File("data/data.txt"));
        SlopeOneRecommender recommender = new SlopeOneRecommender(model);
        LongPrimitiveIterator users = model.getUserIDs();

        while(users.hasNext()) {
            long user = users.nextLong();
            List<RecommendedItem> recommends = recommender.recommend(user, 10);

            for(RecommendedItem recommend : recommends) {
                System.out.println(user + " -> " + recommend.toString());
            }

            /* ユーザーとアイテムの評価予測値を出す場合
            LongPrimitiveIterator items = model.getItemIDs();

            while(items.hasNext()) {
                long item = items.nextLong();
                float value = recommender.estimatePreference(user, item);

                System.out.println(user + " -> " + item + " = " + value);
            }
            */
        }
    }
}