作者:邰原朗
    链接: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),可精度差了点。

    所以,各家网站真正的推荐算法,是他们在综合上述两类算法的基础上,各自研制并且不断地改进调节的,外人不得而知! ^_^


更多