1

我有一个这样的模型(非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);

例如,userSimilarity 在 [0,100] 之间没有标准化,所以如果我想向最终用户显示它,我使用以下解决方案:

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(similarity) = 0 和 max(similarity) = 100?

4

1 回答 1

3

您的性能问题与您的规范化无关,而与计算的其余部分有关。

顺便说一句,我不会使用AveragingPreferenceInferrer。它会减慢速度并且很少有帮助。您可能还会发现简单地遍历所有用户并计算相似度以找到最相似的用户会更快。计算 1 的邻域大致相同,但更接近一些。

Pearson 相关性在 [-1,1] 中。如果您希望它在 [0,100] 的范围内,只需使用 50*(1+correlation)。

于 2012-07-30T10:56:58.903 回答