这就是amazon发明的「喜欢这个商品的人,也喜欢某某」算法。
其核心是数学中的「多维空间中两个向量夹角的余弦公式」,当初我的确是被这算法惊艳到了。
=============2014-12-01 更新 =============================
不好意思,之前说的有误,特来更正兼补充。
「商品推荐」系统的算法(
Collaborative filtering
)分两大类,
第一类,以人为本,先找到与你相似的人,然后看看他们买了什么你没有买的东西。这类算法最经典的实现就是「多维空间中两个向量夹角的余弦公式」;
第二类, 以物为本直接建立各商品之间的相似度关系矩阵。这类算法中最经典是'斜率=1' (
Slope One
)。amazon发明了暴力简化的第二类算法,‘买了这个商品的人,也买了xxx’。
我们先来看看第一类,最大的问题如何判断并量化两人的相似性,思路是这样 --
例子:
有3首歌放在那里,【最炫民族风】,【晴天】,【Hero】。
A君,收藏了【最炫民族风】,而遇到【晴天】,【Hero】则总是跳过;
B君,经常单曲循环【最炫民族风】,【晴天】会播放完,【Hero】则拉黑了
C君,拉黑了【最炫民族风】,而【晴天】【Hero】都收藏了。
我们都看出来了,A,B二位品味接近,C和他们很不一样。
那么问题来了,说A,B相似,到底有多相似,如何量化?
我们把三首歌想象成三维空间的三个维度,【最炫民族风】是x轴,【晴天】是y轴,【Hero】是z轴,对每首歌的喜欢程度即该维度上的坐标,
并且对喜欢程度做量化(比如: 单曲循环=5, 分享=4, 收藏=3, 主动播放=2 , 听完=1, 跳过=-1 , 拉黑=-5 )。
那么每个人的总体口味就是一个向量,A君是 (3,-1,-1),B君是(5,1,-5),C君是(-5,3,3)。 (抱歉我不会画立体图)
我们可以用向量夹角的余弦值来表示两个向量的相似程度, 0度角(表示两人完全一致)的余弦是1, 180%角(表示两人截然相反)的余弦是-1。
根据余弦公式,
夹角余弦 = 向量点积/ (向量长度的叉积)
= ( x1x2 + y1y2 + z1z2) / ( 跟号(x1平方+y1平方+z1平方 ) x 跟号(x2平方+y2平方+z2平方 ) )
可见 A君B君夹角的余弦是0.81 , A君C君夹角的余弦是 -0.97 ,公式诚不欺我也。
以上是三维(三首歌)的情况,如法炮制N维N首歌的情况都是一样的。
假设我们选取一百首种子歌曲,算出了各君之间的相似值,那么当我们发现A君还喜欢听的【小苹果】B君居然没听过,相信大家都知道该怎么和B君推荐了吧。
第一类以人为本推荐算法的好处我想已经很清楚了,那就是精准!
代价是运算量很大,而且对于新来的人(听得少,动作少),也不太好使,
所以人们又发明了第二类算法。
假设我们对新来的D君,只知道她喜欢最炫民族风,那么问题来了,给她推荐啥好咯?