余弦相似度计算结果超出1范围,np.clip无效问题求助
问题分析与解决
你遇到的余弦相似度超出1的情况,大概率是浮点数精度误差导致的——对于非负的用户评分向量,余弦相似度理论值应落在[0,1]区间,但sklearn的cosine_similarity计算时,由于浮点数运算的舍入误差,可能会出现极接近1的微小溢出(比如1.0000000000001)。另外要注意:你在推荐函数里计算的weighted_ratings是预测的物品评分(范围约1-5),不是余弦相似度,别混淆两者。
修复方案
1. 裁剪相似度矩阵的数值范围
在计算完user_similarity后,添加一行代码将所有值强制限制在[0,1]区间内,解决精度溢出问题:
# Calculate user-user cosine similarity user_similarity = pd.DataFrame(cosine_similarity(user_item_matrix), index=user_item_matrix.index, columns=user_item_matrix.index) # 裁剪数值,修正精度溢出 user_similarity = user_similarity.clip(lower=0, upper=1)
2. 区分余弦相似度与预测评分
如果你误把推荐函数输出的score当成了余弦相似度,那是正常现象——这个score是基于相似度加权计算出的预测物品评分,范围和原始评分(1-5)一致,自然会大于1。
额外优化建议
你的推荐计算逻辑里用user_similarity.loc[user].abs().sum()作为分母,用绝对值求和是合理的(避免负相似度拉低结果)。如果你的场景只关注正相似用户,可以考虑过滤掉负相似度的用户,让推荐结果更贴合目标用户偏好:
def get_recommendations(user, user_similarity, user_item_matrix, n_recommendations=2): if user not in user_similarity.index: return None # 只保留与当前用户正相似的用户 positive_similarity = user_similarity.loc[user][user_similarity.loc[user] > 0] if positive_similarity.empty: return pd.Series(dtype='float64') # 基于正相似用户计算加权评分 weighted_ratings = (positive_similarity.values[:, np.newaxis] * user_item_matrix.loc[positive_similarity.index]).sum(axis=0) / positive_similarity.sum() weighted_ratings = pd.Series(weighted_ratings, index=user_item_matrix.columns) # 过滤已评分物品并排序 recommendations = weighted_ratings[user_item_matrix.loc[user] == 0].sort_values(ascending=False) return recommendations.head(n_recommendations)
内容的提问来源于stack exchange,提问作者Mark Fisk
相关产品推荐
相关产品推荐

