基于spark2的推荐引擎(上)

来源:互联网 发布:brooks跑鞋矩阵 编辑:程序博客网 时间:2024/05/23 00:41

        推荐引擎,就是把用户感兴趣的东西推荐给用户,然而推荐的东西,应该尽可能是用户没有购买过的,这样才能更好的挖掘出用户潜在

的需求,避免用户只集中于购买热销的产品,或者自己非常喜欢的产品。推荐引擎分为大众行为的推荐和个性化推荐。

       大众行为的推荐,比较简单,就是管理员人工设定推荐结果,如当下需要宣传的新产品,或者当下卖得比较火的产品。

       个性化推荐,就是对于不同的用户,根据他们的过往消费记录、评分等,推荐更符合用户口味和喜欢的产品。这里我们主要探讨这个。

       个性化推荐,一般有基于记忆的推荐(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。


原创粉丝点击