最近在看推荐系统。主要是看《智能web算法》和《推荐系统实战》这两本书。《智能web算法》中推荐系统只花一个章节来讲。《推荐系统实战》整本书都是在讲推荐的内容。有兴趣的朋友可以看看。在此慢慢写下笔记与诸位来宾交流交流
推荐系统应用广泛。推荐的方式也多种多样。比较常用的有三种方式。1.社会化推荐;2.协同过滤推荐;3.基于内容的推荐。而协同过滤推荐又可以分为基于用户的协同过滤推荐(UserCF)和基于物品的协同过滤推荐(ItemCF)。本文写的是基于用户的协同过滤。
首先来看看基于用户的协同过滤的总体思想:
假如我有一个音乐网站。用户A进来了。作为拥有"智能"的应用。我当然不能让A在一大堆音乐中慢慢去听来看哪首好听哪首不好听(这里有个前提,用户A没有明确的目的,这是搜索引擎跟推荐系统的一个不同点)。所以我就向A推荐一些音乐。怎么推荐。一个方案就是我根据数据去预测A没有评分过的歌曲的可能评分。然后根据预测进行一个排名。把TopN的音乐推荐给A。那么,我们接下来要解决的问题是怎么预测的事。基于用户的协同过滤是通过和A相似的用户来进行预测。假如说B,C,D是A的相似用户,也称邻居。那可以根据B,C,D来预测A没听过的歌曲的评分。思想是利用B,C,D的相似度和歌曲的评分来做加权平均数。得到的就是预测评分。下面举个数据例子来看看。
有相似度向量
B C D
A 0.8 0.6 0.7
有A的未评分歌曲的列表M1,M2,M3和B,C,D对M1,M2,M3的评分。预测A对M1,M2,M3的评分
M1 M2 M3 Degree
B 4 2 2.5 0.8
C 3.5 3 3.5 0.6
D 4.3 1.5 5 0.7
A ? ? ? 1
填好表就行了。
(A,M1)= 4*0.8+3.5*0.6+4.3*0.7。其他的同理。得到A对M1,M2,M3的预测评分。
总结一下过程:
①找邻居
②加权平均预测
上面还有个问题没有解决,那就是相似度的问题。相似度往往跟距离挂钩。相似度可以用欧式距离来算,也有一个雅可比相似度的概念
欧式距离:从数学的角度来讲。求平面执教坐标系或者空间坐标系上任意两点的距离大家都懂求。上升到更高维的角度也是一样的道理。
假如有用户A和用户B分别都对M1,M2,M3。。。Mi进行评分。那我们可以构建两个向量来求都是距离,构建向量如下:
A(x1,y1,z1,....)
B(x2,y2,z2,....)
ODistance = √(x1-x2)²+(y1-y2)²+....;
距离有了,那相似度怎么算。距离越远就越不相似。用智能web里面的话说,距离和相似度是互反的。那就转换一下。用1/ODistance+1作为相似度。+1的目的有两个,一个是防止ODistance为0。另外一个是我个人观点,是为了保证相似度的范围不超过1。通常用欧式距离表示相似度问题不是很大(作者说的,本人项目经验不足)。但有时也有问题。数据相差很大,同时数据项也相差很大的情况下。项数平方和累加已经弥补项数少的平方和了。这样说有点抽象。还是用数字来举例子。
A,B,C三个用户。A和B都对M1进行评分了,评分分别是1,4。A和C都对M2,M3,M4评分了,评分分别是1,2;1,2;1,2。和明显A和C更相似。但是算一算。A和B的相似度和A跟C的相似度是一样的。这就是我说的数据相差很大(1,4),同时项数也相差很大(一项项对比三项),即使你评分相差很大(1-4对比1-2)。那算出来的也有可能相似度一样。这里的很大是相对来说的。毕竟评分就五个等级。既然到这里那就消除项数这个因素带来的差异。在除以一个项数就好了。
上面说的是欧式距离的过程,还有一个雅可比相似度,这个不求距离,公式也很好理解,A 交 B/A 并 B;
假设说A,B是用户,A交B表示A跟B一致评分的音乐的个数(分数是一样的才算一致评分),A并B表示A和B所有评分的音乐的个数(重复算一个)。至于证明,本人不懂证明,也不太懂为什么这个算出来的就是相似度。但是这个方法用的也比较多,至少两本书都有用这个方法找邻居。这里我们又遇到一个要解决的问题。怎么算A交B,又怎么算A并B。智能web里面作者是利用矩阵来算。确实也能算。而且矩阵也不太大。5*5就ok了。
假设A和B对六个音乐进行评分(不一定都两个都评了六首歌),如下
A(2,4,3,1,1)
B(2,3,1,5,1)
通过肉眼可以看出A交B为2,A并B为5。反应到矩阵上规则是这样子的,以A,B分别为横坐标和纵坐标。在5*5的矩阵上对应的坐标上+1。(5*5矩阵初始化为0)。对角线和相加得到A交B,总数相加得到A并B
1 2 3 4 5
1 1 1
2 1
3 1
4 1
5
这样得到了相似度了,这也就解决了找邻居的问题
下一个问题是求加权平均数的预测的问题。这个是要找出A未评分的音乐,用他的TopN邻居来预测,前面写过表来说明了,这里不再赘述。
至于大数据的处理问题,如果有对hadoop下的开发比较熟悉的朋友或许可以试一试,本人hadoop的项目经验不足。只是理解一些基本原理和基本实现过程而已。可能开学会做类似的项目。
---------------------------------------------------------------------------------------------------
后记:
本人想自己实践去开发一个简单的推荐系统,个人利用老师项目之余的业余实践开发。这两天也尽量将分析报告发出来(正勤快练习写文档的能力),到时加链接,有这方面经验的朋友希望多多指教。如果有想找人做类似项目的老大哥本人也非常愿意当个打杂的学习学习。