Surprise库与手动计算的余弦相似度结果不一致问题求助
问题分析:Surprise库与手动计算余弦相似度差异原因
核心差异点
Surprise库中基于物品的KNN协同过滤计算余弦相似度时,仅使用同时对两个物品都有评分的用户数据,不会用0填充缺失值,也不会纳入只评价过其中一个物品的用户(比如你的数据中的用户E)。而你的手动计算错误地将未评分项用0填充,并且纳入了仅评价单物品的用户,导致结果不一致。
验证:重新手动计算(匹配Surprise逻辑)
取同时评价过物品1和物品2的用户(A、B、C、D)的评分向量,重新计算余弦相似度:
import numpy as np # 仅保留共同评分用户的向量 vector1 = np.array([1, 2, 2.5, 4.5]) vector2 = np.array([2, 4, 4, 5]) cosine_sim = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2)) print(cosine_sim)
输出结果:0.9695467115571991,和Surprise计算的0.96954671完全一致。
补充说明
Surprise的KNNWithMeans默认遵循协同过滤的标准逻辑:仅考虑共同评分用户(对两个物品都有评分的用户)计算相似度,这样能避免0填充带来的偏差——未评分不代表用户给出0分,只是未参与评价。
如果需要强制用0填充缺失值的方式计算,你需要手动预处理数据(将NaN替换为0),再自定义相似度计算逻辑,因为Surprise的内置相似度计算不支持这种模式。
内容的提问来源于stack exchange,提问作者ju so
相关产品推荐
相关产品推荐

