You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:57:08