Python协同过滤推荐算法(Collaborative Filtering)2.相似度的计算,相似度计算方法

1.数据分类

  • 实物值(物品或者其他的评分)
  • 布尔值(是或者否的行为),1,0这种布尔值,表肯定或者否定的行为

2.余弦相似度

  • 度量的是两个向量之间的夹角,用夹角的余弦值来度量相似的情况
  • 两个向量的夹角为0时余弦值为1,当夹角为90°时余弦值为0,当夹角为180°时余弦值为-1
  • 余弦相似度在度量文本相似度,用户相似度,物品相似度的时候较为常用
  • 余弦相似度的特点,与向量长度无关,余弦相似度计算要对向量长度归一化,两个向量只要方向一致,无论程度强弱,都可以视为‘相似’

如图:

 说明:

        比如8这个样本,可以从原点出发到8做出一个向量来,每一个点都可以从原点开始做一个向量,比如9样本和6样本,

        预算向量考虑的就是夹角,举个例子,9样本向量和8样本向量的夹角,可以去算他两之间的cos值,我们知道余弦值的范围是[-1,1],

        如果两个向量的角度余弦值算出来是1,那认为两个物品就是相似的或者说是相关的,如果说是0,就是不相似或者说是不相关的,如果是-1的话,就是负相关。实际上利用负相关或者完全不相关也可以做推荐,比如说你和他爱好完全不一样,是相反的,他不喜欢的那你就喜欢,他喜欢的你就不喜欢,是一种负相关的状态,只是说明这种负相关的概念,真正情况下不会用负相关去做推荐的,这就是余弦相似度

        注意余弦相似度不考虑长度,如上图,这个从原点出发到样本点,不会考虑多长,只要大方向是一致的,就认为它是相似的。所以有时候考虑余弦长度的话,可能是会有不考不的结果。 

 举个例子,如上图,x轴和y轴一共两部电影,9样本,一个电影评分给了8分,一个给了5分, 图上新加的10号样本,一个给了2分,一个给了1分,从余弦角度去算,10号样本和9号样本很相似,因为10号样本和9号样本夹角很小,实际上他俩不相似,比如9号给了y轴上的电影算是一个高分,而10号确实很低的分。 

这就是余弦相似度恰恰没考虑这个长度通过这种方式算可能是有点问题的。

就有了另外一种计算相似度的方法,皮尔逊相关系数

3.皮尔逊相关系数

这个皮尔逊相关系数实际上就是对余弦相似度的一个优化,会去做一个向量的中心化

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的基于用户的协同过滤推荐算法Python 代码示例: ```python import numpy as np # 创建用户-物品矩阵 user_item_matrix = np.array([ [3, 1, 2, 3, 0, 0], [4, 2, 3, 4, 0, 0], [2, 3, 1, 2, 0, 0], [0, 0, 4, 3, 2, 1], [0, 0, 5, 4, 1, 2], ]) # 计算用户之间的相似度(使用余弦相似度) def cosine_similarity(user1, user2): numerator = np.dot(user1, user2) denominator = np.linalg.norm(user1) * np.linalg.norm(user2) return numerator / denominator # 根据用户相似度进行推荐 def collaborative_filtering(user_id, user_item_matrix): user1 = user_item_matrix[user_id] similarity_scores = [] for i in range(len(user_item_matrix)): user2 = user_item_matrix[i] similarity = cosine_similarity(user1, user2) similarity_scores.append((i, similarity)) similarity_scores.sort(key=lambda x: x[1], reverse=True) recommended_items = set() for i in range(1, len(similarity_scores)): user_id = similarity_scores[i][0] items = np.where(user_item_matrix[user_id] > 0)[0] recommended_items.update(items) if len(recommended_items) >= 3: break return recommended_items # 示例使用 user_id = 0 recommended_items = collaborative_filtering(user_id, user_item_matrix) print("用户", user_id, "的推荐物品:", recommended_items) ``` 在这个示例中,我们首先创建了一个用户-物品矩阵,表示用户对不同物品的评分。然后定义了一个计算用户之间相似度的函数,使用余弦相似度进行计算。最后,根据用户相似度进行推荐的函数,并给出了一个示例的使用。你可以根据实际情况进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值