推荐系统 - 基于用户的协同过滤推荐 - 入门

原文:https://github.com/litaotao/guidetodatamining/blob/master/chapter-2.md

定义

协同过滤,这个方法是利用他人的喜好来进行推荐,也就是说,是大家一起产生的推荐。他的工作原理是这样的:如果要推荐一本书给你,我会在网站上查找一个和你类似的用户,然后将他喜欢的书籍推荐给你。

 

如何找到相似的用户?

  1. 曼哈顿距离

    不同最简单的距离计算方式是曼哈顿距离。可以在物品评分里用。在二维模型中,每个人都可以用(x, y)的点来表示,这里我用下标来表示不同的人,(x1, y1)表示艾米对两个作品的评分,(x2, y2)表示那位神秘的X先生,那么他们之间的曼哈顿距离就是:

    也就是x之差的绝对值加上y之差的绝对值
    曼哈顿距离的优点之一是计算速度快,对于Facebook这样需要计算百万用户之间的相似度时就非常有利。

  2. 欧几里得距离

    勾股定理

    也许你还隐约记得勾股定理。另一种计算距离的方式就是看两点之间的直线距离:c平方=a平方+b平方
     

    欧几里得距离,可以在物品评分里用。公式是:

  3. 闵可夫斯基距离
    我们可以将曼哈顿距离和欧几里得距离归纳成一个公式,这个公式称为闵可夫斯基距离:
    其中:r = 1 该公式即曼哈顿距离,r = 2 该公式即欧几里得距离,r = ∞ 极大距离

  4. 余弦相似度

它在文本挖掘中应用得较多,每个用户播放歌曲的次数也可以。

余弦相似度的计算中会略过这些非零值。它的计算公式是:

其中,“·”号表示数量积。“||x||”表示向量x的模,计算公式是:

 

问题

相似算法问题1 - 数据稀疏

iTunes上有1500万首音乐,而我只听过4000首。所以说单个用户的数据是 稀疏 的,因为非零值较总体要少得多。当我们用1500万首歌曲来比较两个用户时,很有可能他们之间没有任何交集,这样一来就无从计算他们之间的距离了。曼哈顿距离和欧几里得距离在数据完整的情况下效果最好如何处理缺失数据,这在研究领域仍是一个活跃的话题。本书的后续内容会进行一些讨论,这里先不展开。可以看谁与谁的距离最近,从而推荐最相似的用户高分的东西给他。

相似算法问题2 - 打分标准非常不同

如何比较这些用户呢?比如Hailey的4分相当于Jordan的4分还是5分呢?我觉得更接近5分。这样一来就会影响到推荐系统的准确性了。

  • 左:我非常喜欢Broken Bells乐队,所以我给他们打4分!
  • 右:Broken Bells乐队还可以,我打4分。

问题2解决方法之一是使用皮尔逊相关系数,简单来说就是看两个人的评分趋势,如果一致就是相似。具体解析:

https://github.com/litaotao/guidetodatamining/blob/master/chapter-2.md#%E7%9A%AE%E5%B0%94%E9%80%8A%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0

推荐算法问题1 - 特殊偏好

问题就在于我们只依靠最相似的 一个 用户来做推荐,如果这个用户有些特殊的偏好,就会直接反映在推荐内容里。解决方法之一是找寻多个相似的用户,这里就要用到K最邻近算法 结合 相似度算法了。

K最邻近算法来找出K个最相似的用户(如何找出,参考上面四个相似算法),然后怎么计算每个物品的评分?看这k个用户的相似评分来决定后续每个物品评分比重,然后用这个比重乘以对应相似用户的分数然后汇总获得这物品的评分。

eg:https://github.com/litaotao/guidetodatamining/blob/master/chapter-2.md#k%E6%9C%80%E9%82%BB%E8%BF%91%E7%AE%97%E6%B3%95

 

总结

需要使用K最邻近算法 结合 相似度算法 来做推荐。

应该使用哪种相似度?

  • 如果数据存在“分数膨胀”问题,就使用皮尔逊相关系数。
  • 如果数据比较“密集”,变量之间基本都存在公有值,且这些距离数据是非常重要的,那就使用欧几里得或曼哈顿距离。
  • 如果数据是稀疏的,则使用余弦相似度。

 

代码

https://github.com/litaotao/guidetodatamining/blob/master/chapter-2.md#python%E6%8E%A8%E8%8D%90%E6%A8%A1%E5%9D%97

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对这个问题,我可以为你提供一些关于Python电影推荐系统协同过滤算法的基本知识和实现方法。 首先,电影推荐系统是一种常见的个性化推荐系统,在电影网站和应用程序中广泛应用。它可以根据用户的历史观看记录、评分、喜好等信息,为用户推荐他们可能会喜欢的电影。 协同过滤算法是电影推荐系统中常用的算法之一。它基于用户对电影的历史打分记录,寻找与当前用户兴趣相似的其他用户或电影,然后根据这些相似用户或电影的评分来预测当前用户对其他电影的评分。协同过滤算法主要分为基于用户协同过滤和基于物品的协同过滤两种。 Python中有很多电影推荐系统的实现库和工具,如Surprise、LightFM、TensorFlow等。其中Surprise是一个基于Python的推荐系统开发框架,支持多种推荐算法,包括协同过滤算法的SVD和NMF。 以下是一些Python实现协同过滤算法的示例代码: 使用Surprise库实现基于SVD的协同过滤算法: ```python from surprise import SVD from surprise import Dataset from surprise import accuracy from surprise.model_selection import train_test_split # 加载数据集 data = Dataset.load_builtin('ml-100k') # 切分数据集 trainset, testset = train_test_split(data, test_size=.25) # 构建模型 algo = SVD() # 训练模型 algo.fit(trainset) # 预测评分 predictions = algo.test(testset) # 计算RMSE误差 accuracy.rmse(predictions) ``` 使用Surprise库实现基于NMF的协同过滤算法: ```python from surprise import NMF from surprise import Dataset from surprise import accuracy from surprise.model_selection import train_test_split # 加载数据集 data = Dataset.load_builtin('ml-100k') # 切分数据集 trainset, testset = train_test_split(data, test_size=.25) # 构建模型 algo = NMF() # 训练模型 algo.fit(trainset) # 预测评分 predictions = algo.test(testset) # 计算RMSE误差 accuracy.rmse(predictions) ``` 以上是一些关于Python电影推荐系统协同过滤算法的基本知识和实现方法。如果你有其他问题或需要更详细的解答,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值