推荐引擎,就是把用户感兴趣的东西推荐给用户,然而推荐的东西,应该尽可能是用户没有购买过的,这样才能更好的挖掘出用户潜在
的需求,避免用户只集中于购买热销的产品,或者自己非常喜欢的产品。推荐引擎分为大众行为的推荐和个性化推荐。
大众行为的推荐,比较简单,就是管理员人工设定推荐结果,如当下需要宣传的新产品,或者当下卖得比较火的产品。
个性化推荐,就是对于不同的用户,根据他们的过往消费记录、评分等,推荐更符合用户口味和喜欢的产品。这里我们主要探讨这个。
个性化推荐,一般有基于记忆的推荐(Memory-Based)和基于模型的推荐(Model-Based)。不论哪种推荐,都是基于一个用户-项目(user
-item)的矩阵。示例如下:
上图来自于网络图片。
其中u1,u2……为用户,v1,v2……代表项目,矩阵的内容是用户对某个项目(商品或者品牌)的打分,可以是用户实际的评价打分,
也可以是根据用户的消费次数,消费金额计算出的打分。这是一个稀疏矩阵,因为每个用户消费的项目,只占整个项目的很小的一部分。
基于记忆的推荐,就是直接在这个矩阵上做处理,而基于模型的推荐,多了一个中间步骤,特征提取。
一般的推荐方式:
一、基于人口统计学的推荐,可以理解为根据用户的基本信息来做推荐,比如,单说年龄一个维度,某西装品牌适合30岁左右的男士,
那么如果我们发现一个用户是32岁,这时候我们可以把这个品牌推荐给他,反而如果发现一个用户是18岁,则不推荐。当然一般情况下会
有比较多的维度,例如性别,收入等。但是用户的这些信息,并不是那么容易拿到。
二、基于固定标签的推荐,就是我们把所有的商品人工的打上一些标签,然后用户会选择自己喜欢的标签,根据这种简单的匹配做推
荐,这里不多提。
基于记忆的推荐:
一、基于用户的协同过滤,就是先寻找一个用户的n个相似用户,然后推荐给这个用户他相似用户喜欢的产品。
二、基于物品的协同过滤,就是先找个当前用户喜欢的前n个物品,然后挑选出和这n个物品相似的m个物品推荐给当前用户。
以上的推荐方式,都涉及到寻找相似度。相似度就是两者之间的距离,距离越近,我们认为两个用户或者物品越相似。所以两者之间
的距离,其实是两个向量的距离。一个用户向量是用户对所有项目的打分(未打分的计为0),例如上矩阵图中,u5 = (0,5,0,5,3,3,0)。
同理,一个物品的向量是所有用户对它打分的集合。求解向量之间距离,一般有以下方式:
①欧几里得距离:
因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别。所有这种方式对于打分矩阵还是不错
的,例如打分都为0-5分,然而如果不是打分,是消费额或者消费数量,这个不同商品的刻度显然一同,例如:一个月三个月买一部手机,
而每天喝一杯豆浆,如果按照购买次数来计算,欧几里得距离就不适合。
②明可夫斯基距离:
p等于2的时候与欧几里得距离一样,不多提。
③曼哈顿距离: p等于1时的明可夫斯基距离,不多说。
④切比雪夫距离: p->∞时的明可夫斯基距离。
⑤余弦相似度,就是两个向量夹角的余弦值:
与欧几里得计算距离上的不同不一样,余弦相似度是计算方向上的不同,故并不像欧几里得距离一样要求每个维度的单位刻度必须
相同。
⑥调整余弦相似度,就是为了衡量每个维数值的差异,在计算余弦相似度的时候,每个维度减去一个平均值。例如网上的一个很好
的例子:
比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为
相似,但从评 分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,
就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦
相似度计算,得到-0.8,相似度为负值并且差异 不小,但显然更加符合现实。
⑦Jaccard相似系数:
即是并集的数量除以交集的数量。例如x购买了(1,2,3),y购买了(3,4,5),则结果为1/5。这种距离并未考虑用户对产品的评分。
在一般的推荐系统中,调整余弦相似度是比较常用的。
总的来说,基于记忆的推荐就是对user-item矩阵的行与行,列玉列求相似度,并且通过这一相似度来获取相互用户进行推荐。然后
这就暴露了两个问题。第一,如上面所说,这是一个稀疏矩阵,所以对于任何一个向量,其中为0的部分都特别多,而且往往商品都有非
常多,于是乎问题就变成了两个n维向量之间求距离(n为所以项目数),显然这个计算是耗时且不划算的,所以后面有了矩阵分解,就
是用来降维的。第二、要求最相似用户,就必须把每个用户和当前用户做对比,在用户量较多的情况下,这也比较耗时。所以可以考虑
使用聚类算法,比如k-means等等,然后每次寻找相似用户,只在所在的类中找,大大地减少计算量。
基于模型的推荐:
基于模型的推荐,尝试着去填充上面的矩阵,即通过机器学习的方式,通过对已有的样本进行离线训练,然后建立一个模型来对用户
对未知产品喜好程度进行判断,说白了就是填充user-item矩阵里为0的数据,通过分析那些不为0的数据。用到的算法比如SVD(奇异值分
解),ALS(交替最小二乘法)等,目前spark中使用的als,所以这里着重介绍ALS。
ALS:
ALS算法假设 user-item打分矩阵是近似低秩的。一个 m×n的矩阵 A 可以用两个小矩阵U(m×k)和V(n×k)的乘积来近似:其中k
远小于m和n。也就是说把user-item投影到了一个低维的空间,让原来很长的向量变成一个比较短的向量。然后再求解内积,这样可以大
大降低计算量。举个例子,我们描述水和二氧化碳,可以从状态(气态和液态),颜色,味道,挥发性,可燃性……非常多个维度去诠
释,这时候我们把这些投影到一个三维空间,对就是用元素表示,水(H2O),二氧化碳(CO2),在计算相似性的时候,就可以一个三
维向量(H,O,C)去计算,其中水(2,1,0),二氧化碳(0,2,1)。
既然我们用U和V的乘积来模拟A,之前A中为0的就可以通过计算U和V的乘积计算出一个预估值,那么怎么保证我们的预估的准确性?
当然是通过对那些不为0的值来做对比了哦。那么如何来决定U和V是最优解呢,是的,最小二乘法,求得数据与实际数据之间的误差的平
方和最小。即是:
求通过矩阵U和V相乘所得到的结果与已知的结果的误差的平方和最小时的U和V。而所谓的交替,就是上面公式中u和v都是未知量,所
以先固定u,随机生成一个固定U(0)求V(0),然后再固定V(0)求出U(1),然后通过U(1)求V(1),一直这样交替进行下去,因为误差有下限,所
以als一定收敛。当然在实际使用中,一般会迭代有限次求出一个结果,虽说可能不是最优解,然而影响不大。然而为了更好的进行分布式
计算,降低计算复杂度和通信复杂度,选择法方程来求解ALS。