public static List<RecommendedItem> recommendItemCF(Integer userId,Integer goodId, Integer size) {
List<RecommendedItem> recommendations = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");//本地为localhost
dataSource.setPort(3306);
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setDatabaseName("car");//数据库名
DataModel dataModel=new MySQLJDBCDataModel(dataSource,"comments","user_id","car_id","score","create_time");
System.out.println("基于物品的协同过滤推荐算法开始计算...");
//基于余弦相似性的相似度
ItemSimilarity similarity = new UncenteredCosineSimilarity(dataModel);
LongPrimitiveIterator iterator = dataModel.getItemIDs();
while(iterator.hasNext()){
long id = iterator.next();
double sim = similarity.itemSimilarity(goodId, id);
System.out.println("目标物品:"+goodId+" 与物品:"+id+" 相似度="+sim);
}
GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel,similarity); //推荐算法
//获取推荐物品列表
recommendations = recommender.recommendedBecause(userId,goodId,size);
System.out.println("推荐结果:");
//打印推荐的结果
if(recommendations!=null) {
for (RecommendedItem recommendedItem : recommendations) {
System.out.println("推荐物品:"+recommendedItem.getItemID()+",预测评分:"+recommendedItem.getValue());
}
}
return recommendations;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
遇到的问题:这是Mahout的协同过滤算法,这个推荐的结果我不是很满意或者说不是预期的结果。
我插入了10个用户,10个物品,200条随机评分,然后新创一个用户新的评分,但是推荐的物品只有一个,还是我打分的那个。
这个图就是推荐结果,明明相似的结果挺多,但是经过推荐算法全部pass了,推荐出来的107、108都是我打分过的,按道理不是应该推荐我没打分过的相似物品吗,请问是哪一步出了问题。