基础推荐算法
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.apache.mahout</groupId> <artifactId>mahout-core</artifactId> <version>0.8</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>15.0</version> </dependency>
按照用户相似度 简述:与用户相似选课记录的人喜欢的,但是用户没有学的课推荐给用户。 函数:userSimilarity;客户相似用欧式距离计算(直线距离,标题极其相似) 样本:showxxin1.csv(每个人的选课记录都不一样,无法推荐)。showxxin2.csv(3个人abc,abc人都选了3门同样的课,bc两人都多选了1门课,这时会给a推荐这门课程)。 函数:userSimilarity2;客户相似用曼哈顿距离计算(实际距离,标题大概相似) 样本:虽然其标题不一样,但是标题内容及其相近,所以其showxxin1.csv和showxxin2.csv样本都会给a推荐bc都选了的课。 按照Item相似度 简述:与用户相似选课记录的人喜欢的,用户没有学的,同时这门课其他用户选了,则推荐给用户。与客户相似度主要不同的是item相似度还需考虑本门课程的热门程度。 函数:itemSimilarity; 样本:showxxin3.csv(3个人abc,ab选了3门同样的课,然后b多选了一门课,c也选了这门课,这时会给a推荐bc选的这门课)。showxxin4.csv(样本showxxin3.csv的基础上增加了几组用户)。 注意:样本showxxin3.csv跑userSimilarity是不会出结果的,这是因为showxxin3.csv的数据不足以建立用户相似度,只有基于Item相似度才有效果。所以需根据实际需求选择推荐算法。
按照model模型相似度 简述:多数用户评价较好的课程;先根据评分再根据热门程度,若没有评分数据,则只根据热门程度。 函数:sVDRecommender和slopeOne; 样本:无
import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; import org.apache.mahout.cf.taste.impl.model.MemoryIDMigrator; import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender; import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender; import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender; import org.apache.mahout.cf.taste.impl.recommender.svd.*; import org.apache.mahout.cf.taste.impl.similarity.*; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.recommender.RecommendedItem; import org.apache.mahout.cf.taste.recommender.Recommender; import org.apache.mahout.cf.taste.similarity.ItemSimilarity; import org.apache.mahout.cf.taste.similarity.UserSimilarity; import java.io.*; import java.util.List; import java.util.Random; public class Recommend { static final String inputFile = "data/showxxin6.csv";// 数据源 static final String outputFile = "data/xxout.csv";// 算法所需csv文件 static MemoryIDMigrator thing2long = new MemoryIDMigrator(); public static void main(String[] args) throws IOException, TasteException { CreateCsvRatingsFile(); //创建模型数据源文件 DataModel model = new FileDataModel(new File(outputFile)); // 修改算法引擎 Recommender cachingRecommender = sVDRecommender(model); int userNum = 0; // 对用户进行推荐 for (LongPrimitiveIterator it = model.getUserIDs(); it.hasNext(); ) { userNum++; long userId = it.nextLong(); // 对单个User进行推荐 List<RecommendedItem> recommendations = cachingRecommender.recommend(userId, 1); // 该用户无推荐结果 if (recommendations.size() == 0) { System.out.print("User: "); System.out.print(thing2long.toStringID(userId)); System.out.println(": No Recommend"); } else { // 打印推荐信息 for (RecommendedItem recommendedItem : recommendations) { System.out.print("User: "); System.out.print(thing2long.toStringID(userId)); System.out.print(": "); System.out.println(thing2long.toStringID(recommendedItem.getItemID()) + " Value: " + recommendedItem.getValue()); } } System.out.println("------"); } System.out.println("用户数:" + userNum); } private static void CreateCsvRatingsFile() throws IOException { BufferedReader br = new BufferedReader(new FileReader(inputFile)); BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile)); String line = null; String line2write = null; String[] temp; Random random = new Random(); int ccc=0; while ((line = br.readLine()) != null) { ccc++; if (line.equals("")) continue; temp = line.split(","); long uLong = thing2long.toLongID(temp[0]); long iLong = thing2long.toLongID(temp[1]); // line2write = uLong + "," + iLong; // 无评分 // line2write = uLong + "," + iLong + "," + random.nextInt(10); // 有评分 line2write = uLong + "," + iLong + "," + temp[2]; thing2long.storeMapping(uLong, temp[0]); thing2long.storeMapping(iLong, temp[1]); bw.write(line2write); bw.newLine(); bw.flush(); } System.out.println(ccc); br.close(); bw.close(); } // 根据用户相似度建立推荐引擎,model中需包含:用户ID,itemID,评分 // 个人理解:跟你相似 选课记录 的人喜欢的,但是你没有学的课推荐给你 private static Recommender userSimilarity(DataModel model) throws TasteException { UserSimilarity userSim = new EuclideanDistanceSimilarity(model); //指定NearestNUserNeighborhood作为近邻算法 NearestNUserNeighborhood userNei = new NearestNUserNeighborhood(3, userSim, model);// 邻居的个数,用户相似度,数据模型 // 构建UserCF推荐器 Recommender cachingRecommender = new GenericUserBasedRecommender(model, userNei, userSim); return cachingRecommender; } // 根据用户相似度建立推荐引擎,model中需包含:用户ID,itemID,可选项:评分 // 个人理解:与userSimilarity不同的是对于用户相似度的计算,一个是 EuclideanDistanceSimilarity(欧式距离),一个是CityBlockSimilarity(曼哈顿距离),曼哈顿距离会判断item的内容相似度。 private static Recommender userSimilarity2(DataModel model) throws TasteException { UserSimilarity userSim = new CityBlockSimilarity(model); //指定NearestNUserNeighborhood作为近邻算法 NearestNUserNeighborhood userNei = new NearestNUserNeighborhood(3, userSim, model);// 邻居的个数,用户相似度,数据模型 // 构建UserCF推荐器 Recommender cachingRecommender = new GenericUserBasedRecommender(model, userNei, userSim); return cachingRecommender; } // 根据Item相似度建立推荐引擎,model中需包含:用户ID,itemID。可选项:评分 // 个人理解:与你课程内容相似的人在看的课的,同时这门课还有其他人在学推荐给你 private static Recommender itemSimilarity(DataModel model) { ItemSimilarity itemSim = new LogLikelihoodSimilarity(model);// LogLikelihoodSimilarity(对数似然相似度),重叠的个数,不重叠的个数,都没有的个数 Recommender cachingRecommender = new GenericItemBasedRecommender(model, itemSim); return cachingRecommender; } // 根据model(模型)相似度建立推荐引擎,model中需包含:用户ID,itemID。可选项:评分 private static Recommender sVDRecommender(DataModel model) throws TasteException { // 数据模型,邻居的个数,迭代数 Factorizer fatorizer1 = new RatingSGDFactorizer(model,2,3);// 用户和物品偏差的矩阵分解,用于评级预测 Factorizer fatorizer2 = new SVDPlusPlusFactorizer(model,2,3);// 用于评级预测的经典矩阵分解的增强。感觉稍微增强了一点吧。 Recommender cachingRecommender = new SVDRecommender(model, fatorizer1);// SVD矩阵分解技术的推荐器。fatorizer是分解器类型 return cachingRecommender; } // SlopeOne算法,model中需包含:用户ID,itemID。可选项:评分 // @Deprecated private static Recommender slopeOne(DataModel model) throws TasteException { CachingRecommender cachingRecommender = new CachingRecommender(new SlopeOneRecommender(model)); return cachingRecommender; } }
样本数据:showxxin1
A1,全面实施绩效管理的路径选择,1 A1,构建安全生产治理新格局,1 A1,安全生产工作面临挑战,1 A2,全面实施绩效管理的路径选择2,3 A2,构建安全生产治理新格局2,3 A2,安全生产工作面临挑战2,3 A2,借助风险管理完善事中事后监管,3 A3,全面实施绩效管理的路径选择3,3 A3,构建安全生产治理新格局3,3 A3,安全生产工作面临挑战3,3 A3,借助风险管理完善事中事后监管,3
样本数据:showxxin2
A1,全面实施绩效管理的路径选择,1 A1,构建安全生产治理新格局,1 A1,安全生产工作面临挑战,1 A2,全面实施绩效管理的路径选择,30 A2,构建安全生产治理新格局,30 A2,安全生产工作面临挑战,30 A2,借助风险管理完善事中事后监管,3 A3,全面实施绩效管理的路径选择,30 A3,构建安全生产治理新格局,30 A3,安全生产工作面临挑战,30 A3,借助风险管理完善事中事后监管,4
样本数据:showxxin3
A1,全面实施绩效管理的路径选择,1 A1,构建安全生产治理新格局,1 A1,安全生产工作面临挑战,1 A2,全面实施绩效管理的路径选择,3 A2,构建安全生产治理新格局,3 A2,安全生产工作面临挑战,3 A2,借助风险管理完善事中事后监管,3 A5,借助风险管理完善事中事后监管,2
样本数据:showxxin4
A1,全面实施绩效管理的路径选择,1 A1,构建安全生产治理新格局,1 A1,安全生产工作面临挑战,1 A2,全面实施绩效管理的路径选择,3 A2,构建安全生产治理新格局,3 A2,安全生产工作面临挑战,3 A2,借助风险管理完善事中事后监管,3 A5,借助风险管理完善事中事后监管,2 A5,完善事中事后监管,2 A5,风险管理,2 A6,完善事中事后监管,2 A6,风险管理,2 A6,管理的问题,2 A7,管理的问题,2
发布者:songJian 点击数:1699 发布时间:2018-07-25 19:11:14 更新时间:2018-10-23 18:47:19
正在加载评论...