Mahout (2) - ItemBasedRecommender -

2011-05-01T00:00:00+00:00 Java Mahout

アイテムベースの評価予測?を行う物だと思うんすけど、以下のようなアルゴリズムがサポートされている模様

  • org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity (tanimoto係数)
  • org.apache.mahout.cf.taste.impl.similarity.UncenteredCosineSimilarity (コサイン相関?)
  • org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity (ピアソン相関?)

んまぁあくまでこれはSimilarityであって、それをItemBasedRecommenderで利用して評価予測を行う的な事なので(ry あとあくまで専門的じゃないけど、「評価されていないアイテムに対して評価予測を行うアルゴリズム」として有名なのがSlopeOneとかだったりするのではと。んまぁSlopeOneもサポートされているけど今回はパス

前回同様なCSVなデータを定義する

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

まぁ適当で作ったんですが、これを使ってユーザーが評価を下していないアイテムに対して評価予測するMahoutでする場合

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

import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.similarity.UncenteredCosineSimilarity;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.recommender.ItemBasedRecommender;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;

public class Client {
    public static void main(String[] args) throws Exception {
        File dataFile = new File(Client.class.getResource("data.csv").getFile());
        DataModel model = new FileDataModel(dataFile);
        ItemSimilarity similar = new UncenteredCosineSimilarity(model);
        ItemBasedRecommender recommender = new GenericItemBasedRecommender(model, similar);
        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);

                if (value.isNaN())
                    continue;

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

書いてる通りUncenteredCosineSimilarityを使って評価予測を出す。実行すると

1 -> RecommendedItem[item:105, value:3.9863634]
1 -> 101 = 4.0
1 -> 102 = 5.0
1 -> 103 = 2.0
1 -> 104 = 4.0
1 -> 105 = 3.9863634
1 -> 106 = 5.0

2 -> RecommendedItem[item:102, value:3.0184772]
2 -> RecommendedItem[item:106, value:3.018345]
2 -> 101 = 2.0
2 -> 102 = 3.0184772
2 -> 103 = 3.0
2 -> 104 = 4.0
2 -> 105 = 3.0
2 -> 106 = 3.018345

3 -> RecommendedItem[item:103, value:3.451569]
3 -> 101 = 1.0
3 -> 102 = 4.0
3 -> 103 = 3.451569
3 -> 104 = 5.0
3 -> 105 = 3.0
3 -> 106 = 4.0

4 -> RecommendedItem[item:103, value:3.6650271]
4 -> RecommendedItem[item:104, value:3.658833]
4 -> RecommendedItem[item:101, value:3.6428013]
4 -> 101 = 3.6428013
4 -> 102 = 5.0
4 -> 103 = 3.6650271
4 -> 104 = 3.658833
4 -> 105 = 2.0
4 -> 106 = 4.0

5 -> RecommendedItem[item:101, value:2.507321]
5 -> RecommendedItem[item:105, value:2.490756]
5 -> 101 = 2.507321
5 -> 102 = 3.0
5 -> 103 = 1.0
5 -> 104 = 3.0
5 -> 105 = 2.490756
5 -> 106 = 3.0

んまぁそんなもんで(ry

Mahout (1) - LogLikelihood -