协同过滤中相似度矩阵的计算

对用户的行为进行分析得到用户的偏好后,可以根据用户的偏好计算相似用户和物品,然后可以基于相似用户或物品进行推荐。这就是协同过滤中的两个分支了,即基于用户的协同过滤和基于物品的协同过滤。

      关于相似度的计算,现有的几种方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。

      在推荐场景中,在用户-物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户某个物品的偏好作为一个向量来计算物品之间的相似度。

1.同现相似度

计算公式为:

                                

分母|N(i)|是喜欢物品i的用户数,而分子|N(i)∩N(j)|是同时喜欢物品i和物品j的用户数据。

为了防止j为热门物品,修正为:

                                        

2.欧式距离相似度

最初用于计算欧几里得空间中的两个点的距离,假设x、y是n维空间的两个点,它们之间的欧几里得距离是:

                                             

可以看出,当n=2时,欧几里得距离是平面上的两点的距离。

当用欧几里得距离表示相似度时,一般采用一下公式进行转换:距离越小,相似度越大。

                                         

3.Cosine相似度

Cosine相似度被广泛应用于计算文档数据的相似度:

### 协同过滤中的相似度计算公式 在协同过滤中,用户之间的兴趣相似度可以通过多种方式计算。以下是几种常见的方法及其对应的实现。 #### 1. 使用调整后的共现矩阵计算相似度 为了更精确地衡量用户间的兴趣相似度,可以采用一种改进的方法,即考虑物品的流行程度对相似度的影响。具体而言,假设两个用户 $ u_i $ 和 $ u_j $ 对某些物品有过相同的行为(比如购买或评分),则它们的兴趣相似度可以用以下公式表示: $$ \text{sim}(u_i, u_j) = \frac{\sum_{k} w(k) I(u_i,k)I(u_j,k)}{\sqrt{\sum_k w(k)^2 I(u_i,k)} \cdot \sqrt{\sum_k w(k)^2 I(u_j,k)}} $$ 其中: - $ k $ 表示某个物品, - $ I(u_i, k) $ 是指示函数,当用户 $ u_i $ 对物品 $ k $ 发生行为时取值为1,否则为0, - $ w(k) $ 是权重因子,通常定义为 $ \log(\frac{|U|}{|\text{users of } k|}) $,用来降低热门物品对相似度的影响[^2]。 这种加权的方式能够有效减少像《新华字典》这样的热门物品对相似度计算的干扰。 --- #### 2. 利用余弦相似度计算用户间兴趣相似度 另一种常用的方法是通过用户的偏好向量来计算相似度。对于任意两位用户 $ A $ 和 $ B $,其偏好向量分别记作 $ V_A $ 和 $ V_B $。如果某位用户对某一物品有交互记录,则对应位置设为1;反之设为0。那么两者的余弦相似度可由下述公式给出: $$ \cos(V_A, V_B) = \frac{V_A \cdot V_B}{||V_A|| \times ||V_B||} $$ 这里的点积运算 $ V_A \cdot V_B $ 实际上就是统计两者共同感兴趣的物品数量,而分母部分则是各自偏好数量平方根的乘积[^3]。 ```python import numpy as np def cosine_similarity(user_a_vector, user_b_vector): dot_product = np.dot(user_a_vector, user_b_vector) norm_a = np.linalg.norm(user_a_vector) norm_b = np.linalg.norm(user_b_vector) similarity = dot_product / (norm_a * norm_b + 1e-8) # 防止除零错误 return similarity ``` 上述代码实现了基于余弦距离的简单版本,适用于稀疏场景下的快速评估。 --- #### 3. Pearson 相关系数作为替代方案 除了余弦相似度外,还可以利用皮尔逊相关系数测量两个人之间的一致性水平。给定一组共有评价对象集合 $ K $ ,以及每位参与者针对这些目标所赋予的具体分数序列 $ r_u(K) $ 及平均得分 $\bar{r}_u$ , 它们的关联强度表达式如下所示: $$ \rho(A,B)=\frac {\sum _{{i\in K}}(r_{{A,i}}-\bar {r}_{A})(r_{{B,i}}-\bar {r}_{B})} {{\sqrt {\sum _{{i\in K}}(r_{{A,i}}-\bar {r}_{A})^{2}}}*{\sqrt {\sum _{{i\in K}}(r_{{B,i}}-\bar {r}_{B})^{2}}}} $$ 此公式的优点在于它不仅关注绝对数值上的匹配情况,还兼顾到了相对偏差因素的作用效果[^1]。 ```python from scipy.stats import pearsonr def pearson_correlation(vector_a, vector_b): corr, _ = pearsonr(vector_a, vector_b) return corr ``` 这段脚本调用了 SciPy 库里的功能完成自动化处理过程。 --- ### 总结 综上所述,在实际应用过程中可以根据具体情况选用不同的策略来进行用户兴趣建模并据此预测未知喜好倾向。无论是改良版的基础模型还是引入额外特征维度扩展出来的复杂架构都有助于提升最终结果质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值