Mahout (2) - ItemBasedRecommender -
アイテムベースの評価予測?を行う物だと思うんすけど、以下のようなアルゴリズムがサポートされている模様
- 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