似乎咱的产品七,八年前就想做个推荐系统的,就是类似根据用户的喜好,自动的找到用户喜欢的电影或者节目,给用户做推荐。可是这么多年过去了,不知道是领导忘记了还是怎么了,连个影子还没见到。
而市场上各种产品的都有了推荐系统了。比如常见的各种购物网站京东,亚马逊,淘宝之类的商品推荐,视频网站优酷的的类似影片推荐,豆瓣音乐的音乐推荐......
一个好的推荐系统推荐的精度必然很高,能够真的发现用户的潜在需求或喜好,提高购物网詀的销量,让视频网站发现用户喜欢的收费电影... 可是要实现一个高精度的推荐系统不是那么容易的,netflix曾经悬赏高额奖金寻找能给其推荐系统的精确度提高10%的人,可见各个公司对推荐系统的重视和一个好的推荐系统确实能带来经济效益。
下面咱以电影电视的推荐系统为例,一步一步的来实现一个简单的推荐系统吧, 由于比较简单,整个推荐系统源码不到100行,大概70-80行吧,应该很容易掌握。 为了快速开发原型,咱采用Python代码来演示
不同的业务,不同的推荐系统需要收集的信息不一样 针对咱要做的电影推荐,自然是每个用户对自己看过的电影的评价了,如下图所示:
Kai Zhou对Friends打分是4分, 对Bedtime Stories打分是3分,没有对RoboCop打分 Shuai Ge没有对Friends打分,对Bedtime Stories打分是3.5分 ...... 为简单,咱将此数据存成csv文件,形成一个二维的矩阵,假设存在D:\train.csv, 数据如下:
Name,Friends,Bedtime Stories,Dawn of the Planet of the Apes,RoboCop,Fargo,Cougar Town
Kai Zhou,4,3,5,,1,2
Shuai Ge,,3.5,3,4,2.5,4.5
Mei Nv,3,4,2,3,2,3
xiaoxianrou,2.5,3.5,3,3.5,2.5,3
fengzhi,3,4,,5,3.5,3
meinv,,4.5,,4,1, m
incat,3,3.5,1.5,5,3.5,3
alex,2.5,3,,3.5,,4
数据有了,下面咱就正式开始干活了 ,推荐系统要干些什么呢?
咱以电影推荐来说,推荐系统需要解决的几个主要问题:
1. 判断两个电影,两个观影人之间的相似度
2. 找到和某影片最相似的影片, 或找到和某观影人有同样兴趣的人
3. 找到某观影人可能喜欢的电影,或找到对某影片感兴趣的人
针对咱的电影推荐来说,就是判断两个电影,两个观影人之间的相似度。
2.1 欧几里德距离计算相似度 最简单的,最容易理解的就是欧几里德距离. 那么,什么是欧几里德距离,怎么用呢? 请对比评价数据,看下图:
咱用两个电影Fargo和Cougr Town来取例 图中X轴代表电影Fargo, Y轴代表电影Cougr Town, Kai Zhou给电影Fargo 打1分,Cougr Town打2分,画到图上
同理,咱可以将Shuai Ge和Mei Nv的数据点都画到图上 很明显,咱可以看出Kai Zhou与Mei Nv 离得近,与Shuai Ge离得远,所以说Kai Zhou与Mei Nv的兴趣更相近. 用数学式子表达出来就是:
Kai Zhou与Mei Nv的距离的平方: (2 - 1)^2 + (3 - 2)^2 = 2
Kai Zhou 与Shuai Ge的距离的平方: (2.5 - 1)^2 + (4.5 - 2)^2 = 8.5
2 < 8.5, 所以Kai Zhou与Mei Nv比Shuai Ge兴趣更近. 这就是利用欧几里得距离来判断相似度 两个用户对所有电影的评价相似度的和,就是两用户的相似度
本博客已搬家至: http://www.kai-zhou.com, 其他博客已停止更新,欢迎访问:不到100行代码实现一个简单的推荐系统 查看文章的最新版本.
原文地址:http://blog.csdn.net/zxcred/article/details/45055737