编程Python开发技术

用python写一个简单的推荐系统

2016-10-18  本文已影响390人  PyChina

前言


在上篇文章豆瓣电影,电视剧DM实战中提及到,我和室友们产生了剧荒,萌生出要做一个个人用的推荐系统,解决剧荒的问题的想法,经过一轮的死缠烂打,这个个人推荐系统终于成型了。

今天来分享一下心得,对此感兴趣的朋友可以自己对着写一个。

传统推荐系统算法


首先介绍一下传统的推荐系统方法,之所以叫它传统,是因为大部分学习资料上都是用这一个方法。

我们来假设有这么一个矩阵(用python的列表表示):

  [# A B C D E
    [2,0,0,4,4], #1
    [5,5,5,3,3], #2
    [2,4,2,1,2]  #3
    ......
  ]

矩阵的行代表用户,列表示物品,其交点表示用户对该物品的评分。

假设现在用户1需要选商品,推荐系统则假设其会选择并未选择过的商品,因此,系统会在第一行中寻找评分为0的物品,显然会找到B和C。这时,该怎么知道是推荐B还是C呢?(假设用户只需推荐一个),这时则需要计算B、C和用户以前选择过的物品(已评分)的相似度。

仅仅算出相似度还不够,因为你不能判断这到底是好的那一部分相似还是坏的部分相似。所以这时,我们需要引入用户的评分作为相似度计算的权重,评分X相似度得到最后的得分(该得分会一直累加,则B的推荐得分会是B与A,D,E的相似得分的累加和)。这样一来,评分低物品的最后得分自然就低,评分高的物品自然得分就高,这时问题就简化成排序问题了。

显然,上述问题的核心在于如何计算相似度。

这里给出计算相似度的两种方法:

欧式距离法

AB为两列向量,||A||表示A的2范数
特别注意一点的是,cos的取值是-11,我们需要将其归一化,即把范围弄成在01上。于是相似度计算公司变成0.5 + 0.5*cos

少用户推荐系统的创新


在上述的内容中,我们可以发现传统的方法有一个特出的问题,传统的算法需要大量的用户评分,即矩阵的行数需要较多才能得出的结果才值得参考。这一个需求咋看起来是没什么问题,也符合我们的逻辑,唯有数据量足够,我们才能找到较为准确的规律嘛。

但回到我的需求上来说,这可是一个明显的缺点,在前言我说明的需求上说过这是一个给宿舍甚至是个人使用的推荐系统。

也就是说:

record = {
    "labelName":(weight,time),
    "labelName2":(weight,time)
    ……
}
#labelName是标签名称,在该标签下有一个元组,元组的第一个字段是这个标签的权重。
#权重越大,表示用户越喜欢这个标签。
#第二个字段是创建该标签的起始时间

在实现推荐时,则较为容易实现,给定testList。这时需要:

现在正在宿舍投入运行,至于效果如何可能要一段时间才知道了

后话


github 地址

说明一下,github上只是提供了一个实现了上述改进后思路的类recommend.py,并不是一个成型的推荐系统,你可以下载后,根据这个类进行二次开发,比如:

迟下我会上传一个使用falsk封装的一个简单的webserver去github,可以通过web API请求,返回json格式的电影信息。

如有错误,望指正。

上一篇 下一篇

猜你喜欢

热点阅读