推荐系统与应用随记

推荐系统两个著名的模型: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。 我们让预测出来的得分和相应位置已经有得分位置的值最接近。 第一个因子对最后的推荐贡献了多少,第二个因子对最后的推荐贡献了多,第三个因子对最后的推荐贡献了多,把所有的这些因子的贡献加在一块就是最后的推荐值。

隐语义模型进一步优化

每个用户都会有一个平均打分, 每部电影大家打他也会有一个平均打分, 所有人在所有电影上的得分也会有一个均值。 这三个均值也会影响最后的结果。我想把这3个均值也加到公式中最后的影响因素里头。 Time表示前面我们指的context上下文。

你可能感兴趣的:(推荐系统与应用随记)