网易云的推荐算法 Collaborative filtering
作者:邰原朗
链接:https://www.zhihu.com/question/26743347/answer/34235147
来源:知乎
著作权归作者所有,转载已获得授权。
“商品推荐”系统的算法 (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 君,只知道她喜欢最炫民族风,那么问题来了,给她推荐啥好咯?
如图,推荐《晴天》!
呵呵,第二类算法的好处大家也看出来了,简单粗暴好操作 (也适合 map-reduce),可精度差了点。
所以,各家网站真正的推荐算法,是他们在综合上述两类算法的基础上,各自研制并且不断地改进调节的,外人不得而知! ^_^