Mahout (5) - SlopeOneRecommender -
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);
}
*/
}
}
}