我有一个这样的模型(非Hadoop):
DataModel data = new FileDataModel(new File("file.csv"));
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(data));
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(1, userSimilarity, data);
例如,[0,100]之间没有规范化userSimilarity,所以如果我想将它显示给最终用户,我使用以下解决方案:
long maxSim = userSimilarity.userSimilarity(userId1, userNeighborhood.getUserNeighborhood(userId1)[0]);
long finalSimilarity = Math.min(100, Math.max((int) Math.ceil(100 * userSimilarity.userSimilarity(userId1, userId2) / maxSim), 0))
我观察到性能问题(每个用户的各种秒数),是否有另一种可能性,或者最快的方法是让每个给定用户的min(相似性)= 0和max(相似度)= 100?
答案 0 :(得分:3)
您的性能问题与规范化无关,而与计算的其余部分有关。
顺便说一句,我不会使用AveragingPreferenceInferrer
。它减慢了速度,很少有帮助。您还可以更快地简单地循环遍历所有用户并计算相似性以找到最相似的用户。计算1的邻域大致相同但更接近。
Pearson相关性在[-1,1]。如果你想要它在[0,100]范围内,只需使用50 *(1 +相关)。