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

余弦相似度计算结果超出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:23:13