从源代码剖析Mahout推荐引擎
3). 构造近邻算法模型
public enum NEIGHBORHOOD { NEAREST, THRESHOLD } public static UserNeighborhood userNeighborhood(NEIGHBORHOOD type, UserSimilarity s, DataModel m, double num) throws TasteException { switch (type) { case NEAREST: return new NearestNUserNeighborhood((int) num, s, m); case THRESHOLD: default: return new ThresholdUserNeighborhood(num, s, m); } }
4). 构造推荐算法模型
public enum RECOMMENDER { USER, ITEM } public static RecommenderBuilder userRecommender(final UserSimilarity us, final UserNeighborhood un, boolean pref) throws TasteException { return pref ? new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { return new GenericUserBasedRecommender(model, un, us); } } : new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { return new GenericBooleanPrefUserBasedRecommender(model, un, us); } }; } public static RecommenderBuilder itemRecommender(final ItemSimilarity is, boolean pref) throws TasteException { return pref ? new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { return new GenericItemBasedRecommender(model, is); } } : new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { return new GenericBooleanPrefItemBasedRecommender(model, is); } }; } public static RecommenderBuilder slopeOneRecommender() throws TasteException { return new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel dataModel) throws TasteException { return new SlopeOneRecommender(dataModel); } }; } public static RecommenderBuilder itemKNNRecommender(final ItemSimilarity is, final Optimizer op, final int n) throws TasteException { return new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel dataModel) throws TasteException { return new KnnItemBasedRecommender(dataModel, is, op, n); } }; } public static RecommenderBuilder svdRecommender(final Factorizer factorizer) throws TasteException { return new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel dataModel) throws TasteException { return new SVDRecommender(dataModel, factorizer); } }; } public static RecommenderBuilder treeClusterRecommender(final ClusterSimilarity cs, final int n) throws TasteException { return new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel dataModel) throws TasteException { return new TreeClusteringRecommender(dataModel, cs, n); } }; }
5). 构造算法评估模型
public enum EVALUATOR { AVERAGE_ABSOLUTE_DIFFERENCE, RMS } public static RecommenderEvaluator buildEvaluator(EVALUATOR type) { switch (type) { case RMS: return new RMSRecommenderEvaluator(); case AVERAGE_ABSOLUTE_DIFFERENCE: default: return new AverageAbsoluteDifferenceRecommenderEvaluator(); } } public static void evaluate(EVALUATOR type, RecommenderBuilder rb, DataModelBuilder mb, DataModel dm, double trainPt) throws TasteException { System.out.printf("%s Evaluater Score:%s\n", type.toString(), buildEvaluator(type).evaluate(rb, mb, dm, trainPt, 1.0)); } public static void evaluate(RecommenderEvaluator re, RecommenderBuilder rb, DataModelBuilder mb, DataModel dm, double trainPt) throws TasteException { System.out.printf("Evaluater Score:%s\n", re.evaluate(rb, mb, dm, trainPt, 1.0)); } /** * statsEvaluator */ public static void statsEvaluator(RecommenderBuilder rb, DataModelBuilder mb, DataModel m, int topn) throws TasteException { RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator(); IRStatistics stats = evaluator.evaluate(rb, mb, m, null, topn, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0); // System.out.printf("Recommender IR Evaluator: %s\n", stats); System.out.printf("Recommender IR Evaluator: [Precision:%s,Recall:%s]\n", stats.getPrecision(), stats.getRecall()); }
6). 推荐结果输出
public static void showItems(long uid, List recommendations, boolean skip) { if (!skip || recommendations.size() > 0) { System.out.printf("uid:%s,", uid); for (RecommendedItem recommendation : recommendations) { System.out.printf("(%s,%f)", recommendation.getItemID(), recommendation.getValue()); } System.out.println(); } }
7). 完整源代码文件及使用样例:
https://github.com/bsspirit/maven_mahout_template/tree/mahout-0.8/src/main/java/org/conan/mymahout/recommendation/job