协同过滤推荐算法理解

本文介绍了基于用户和物品的协同过滤推荐算法。基于用户的协同过滤是利用兴趣相投群体的喜好推荐信息,可通过余弦相似度和皮尔逊相关系数判断用户相似度,但存在冷引导和矩阵稀疏问题。基于物品的协同过滤则是计算物品间相似度进行推荐。
  • 基于用户的协同过滤
    先给个例子,有用户 A 喜欢物品 X,Y, Z,用户 B 喜欢物品 X, Y,那么我们可以说用户 A 和 B 是属于同一类的,那么我们就可以把 A 喜欢的 Z 推荐给 B。 这就是基于用户的协同过滤算法的基础。
    那么什么是协同过滤,这里是维基百科的介绍:简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。
    那么,问题就变成了我们如何区分兴趣相投的用户。用户之间的相似度应该如何评判。当我们得到用户的相似度的时候,我们就可以对某个用户 A, 选择其相似度高的用户群体的喜爱偏好进行推荐。
    对于用户之间的相似度,我们可以用余弦相似度,和皮尔逊相关系数来进行判断。

  • 我们下面用四个用户对六类物品的评分来简单的计算下各类相似度。

物品1物品2物品3物品4物品5物品6
用户1530045
用户2015242
用户3114020
用户4443500

首先是余弦相似度:

def consine(data):
    sim = np.empty([data.shape[0], data.shape[0]])
    for i in range(data.shape[0]):
        for j in range(data.shape[0]):
        	# sim[i][j] = 1 - cosine(data[i], data[j])
            sim[i][j] = np.dot(data[i], data[j]) / (
                (math.sqrt(np.dot(data[i], data[i])) * (math.sqrt(np.dot(data[j], data[j])))))
    print(sim)
用户1用户2用户3用户4
用户110.473568020.393892770.45482819
用户20.4735680210.87438290.5048252
用户30.393892770.874382910.52486388
用户40.454828190.50482520.524863881

可以看出,用户与自己的相似度是1,而用户2和用户3对物品的评价比较接近,所以表现出了 0.87的强的相似度,用户1和用户3的相似度则比较弱。
再看皮尔逊相关系数,皮尔逊映射的值会在 [-1, 1] 之间,我们乘以 0.5 在加上 0.5 把它映射到 [0, 1] 之间。

import numpy as np
pers = np.corrcoef(X)
print(pers * 0.5 + 0.5)
用户1用户2用户3用户4
用户110.215546030.330600050.2265973
用户20.2155460310.872776510.34770351
用户30.330600050.8727765110.459004
用户40.22659730.347703510.4590041

相似度与余弦相似度相差不大。
由此,当我们需要对用户 A 进行推荐的时候,我们可以选择与其相似度高的用户的评价历史,然后对其进行推荐,这里我们需要筛选掉用户 A 已经评价过的物品。
基于用户的协同过滤算法需要有一定的数据积累,即冷引导问题,还有就是用户不可能对所有的物品进行评价,只有极少部分被评价了,这就导致了矩阵的稀疏性。

  • 基于物品的协同过滤
    相反的,基于物品的协同过滤,我们是计算物品与物品之间的相似度,例如,假设用户 A 购买了 X,Y,用户 B 购买了 X, 那么我们可以看作 X 和 Y 具有一定的相似度,而用户 B 买了 X,那我们就可以给用户 B 推荐 Y。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值