推荐系统两个著名的模型:CF和LFM
数学定义
寻求解决信息过载的思路
系统结构
用户画像刻画一些用户维度的信息,例如这个人的学历,经济收入状况等等,以后无论是用户推荐,分类,排序,都会有用户画像的相关应用。评定标准
均方误差(MSE) 均方根误差(RMSE)对式子除以T,使得其与测试样本T无关。得到用户在每个物品上平均的一个差异度。
你能拿到用户对商品的一个评分,例如:一颗星,两颗星或者直接的一个分数值。
用户有没有点,以及用户在这个页面的停留时间,视频看没看等等,有这么个是与否的用户行为在,根据这些行为也是可以建立准确度的评判标准。提升准确率可以减少topN的量,可以只推荐一篇或者两篇,这样可以很好的拟合用户的兴趣,它很有可能会点。问题是用户如果还想看这两篇以外的呢,那其他的就没有召回来。所以准确率和召回率这两项是互相影响的。好的推荐要尽量的使得这两项有个比较好的结果。另外推荐系统对precision的要求更高一些。
ROC AUC
I代表全部商品的量。所有推荐的商品 覆盖了全部商品的多少。从信息论的角度来看就是:1000w的商品中,每个商品被推荐的次数除以总次数。
如果电商有1000w的商品,你推荐的商品只覆盖了其中20w,那这推荐就是有问题的。
1/2|R(u)|(|R(u)-1|)表示从推荐列表中任意取两个的可能取法。除以它表示任意两个的平均相似度。 1-平均相似度表示任意两个的平均差异度。差异度就是多样性有多高。s(i,j)的计算方法,例如:在电商的体系当中,他会有类目这个属性,建立的向量中也会包含这个分类属性。如果两个商品品类不同的话,可以把相似度设置为0
新颖度和惊喜度这两个标准不太好评定,需要通过用户反馈和调研来获取。推荐系统一般推荐的是热门信息,大部分用户都是趋同的
基于内容的推荐
对每一份资料建立向量,对每个要推荐的内容(item)进行挖掘,每个item都是一个向量,假设有4000个词的词表,每个词在item向量中会占据一个固定的位置,如果这个词在这个文档中出现过,我们就会去计算这个词在文档中的重要程度,然后把重要程度填在相应的位置,每个文档都会产生一个向量。对用户也建立一份相应的资料,资料的建法是 用户之前总会阅读过一些资料,那么这些看过的资料应该也会有向量,即4000个词对应相应程度的向量。然后对这些看过的资料向量做一个平均或者加权平均。或者是将这些资料的向量先揉在一块建立一个向量。
用用户的向量和文档的向量去求一个相似度。通常用用户的向量和那些用户没有看过的文档资料进行比对,挑出来一些比较接近的文档。
协同过滤
协同过滤一种基于近邻的算法,意思是我需要去找到和我最接近的邻居,根据这些邻居来做决策。
1.基于近邻去做综合的判定。2.近邻怎么找?依托于用户在共同商品上的行为,即A,B用户在a,b,c,d,e 5个商品上的得分,去判定这两个用户之间是不是近邻,如果是近邻 那么他们有多近。 找近邻?现在有商品a,b 用户A,B,C,D,E 用户分别对商品a,b都有一个打分。基于各自用户对商品的打分向量来计算商品的相似度。
相似度/距离定义
Jaccard相似度一般用于TopN推荐,要么用户看了要么没看。基于物品的协同过滤
R_xi预测用户x对商品i的评分。通过计算找回来了最接近的五个物品I(i1,i2,i3,i4,i5)
1号电影如果要推荐给5号用户,预测1号电影推荐给5号用户的得分。 这里的权重(用户的打分)取的是TopN的权重,没有把所有的电影拿过来,原因是在电商的体系当中,如果你要推荐商品,电商总共的商品也许有上千万,那这个时候如果每一个商品都拿来比对,显然是不可行的,所以我们只会取TopN这一部分,比如上图只取了3号和5号两部电影,评估一下把1号电影推荐给5号用户会得多少分!!基于用户的协同过滤
预测用户i对商品j的评分Vi,j大K表示归一化因子,用来做加权平均。
基于用户的是求列向量之间的相识度。计算每一列和5号列的相识度,取出其中的TopN,假设3号和11号和他是最接近的,求相识度时建议用皮尔森来求。注意:公式比较粗略,可以参考:www.cnblogs.com/zhangchaoya…
UserCF vs ItemCF
对于买过,推荐结果集中又包含的同类商品,推荐模型本身是不能帮你处理的,需要自己根据得到的结果集进行处理。CF的优缺点
冷启动问题
隐语义模型
用户对某些电影打分高,一般是基于某些因素去做的,例如:演员,主题等等。对电影做打分,好或者不好,一般是某些因素在的。
假设打分取决于3个因素,那我们就来看看,用户和这3个因素的关联,以及电影和这三个因素的关联,这就是所谓的矩阵分解。
矩阵分解的物理意义,可以这么理解,M*N的矩阵可以看成是M*F的矩阵和F*N的矩阵相乘(M*N=M*F * F*N)。是这N个用户对这F个隐层因素上的值或者得分,以及这M个商品对这F个隐层因素上的值或者得分之间做一个关联 决定了他最后的得分。 用户和隐层的关联与商品和隐层的关联,做乘法的意思就是看看这关联一不一致,不一致的话它就是负向的(负的得分),一致的话他就是一个正向的(正的得分)。因素怎么判别?矩阵分解!
SVD分解在这种场景下不一定合适,第一它的时间复杂度太高,第二因为有些位置是空的(没有得分),它会在这个位置填上一个零,但这是你人为的填充,当你分解后还原回来的时候,这个位置的值依然很小,达不到我们对缺省位置填充值的这么一个作用。SVD对于有缺省的值,因为你必须要在这个缺省的位置填上一个分数,你又没有东西可以填,很多时候你会给他一个零,但在给零的情况下,就相当于你人为的给了他一个分数,所以他在把这个矩阵还原回来的时候,这个缺省值的位置依据会趋于零,这个方式是不合理的。
如果要用矩阵分解,又不想受到没有得分位置的影响,怎么办?办法是假设现在有个U个用户,D个item,我想要找到K个关联因子,让已经有得分的位置尽量的接近,没有分数的位置不管它。 r_ij:第i个用户对j个商品的评分,依据我分解出来的矩阵做预测,他的得分会是多少呢?得分是通过两个向量的内积得到的,例如上面图中的[1,-2,0]*[-1,4,2]=5。 我们让预测出来的得分和相应位置已经有得分位置的值最接近。 第一个因子对最后的推荐贡献了多少,第二个因子对最后的推荐贡献了多,第三个因子对最后的推荐贡献了多,把所有的这些因子的贡献加在一块就是最后的推荐值。