电子商务,电影视频,音乐电台,社交网络,阅读,基于位置(外卖,打车),个性化邮件,个性化广告
根据用户的 历史行为 / 点赞 / 页面停留时间 等来推荐用户感兴趣的物品
推荐系统根据用户的以下行为来判断用户当前的需求或感兴趣的点:
目前我们处于互联网数据大爆炸的时代,每天会接收到很多的信息,但是并不是每种信息都感兴趣,所以推荐系统也是解决信息过载问题的思路。
对用户而言:
对商家而言:
1、打分系统(有用户的打分实际数值,如电影评分3分)
2、Top N推荐(推荐前N个预测的)
系统不会让用户给自己喜欢的东西打分,可以根据停留时间来判断其喜好程度。
准确率vs召回率
准确率:在推荐的商品中,哪些是真正感兴趣的
召回率:在推荐的商品中,占用户感兴趣商品的比例
3、覆盖率(对平台而言)
马太效应:好的越好,坏的越坏,多的越多,少的越少
覆盖率表示了对物品长尾的发掘能力
有两个判别准则,一个维覆盖率Coverage,另一个是熵
Coverage:假如推荐商品类别数量为9w个,而冷门商品虽然被推荐了5000个,但是可能每种只推荐了一次,热门的商品还是被推荐的多,所以仍然会有马太效应。
熵:由于覆盖率仍然会有马太效应,所以用熵来评估推荐物品种类的多样性,已知熵是度量样本不确定性的准则,所以我们希望H越大越好,因为当每个商品被推荐的概率基本相同的时候,熵最大,所以用熵来评估平台对不同商品的推荐覆盖率。
4、多样性(对用户而言)
对用户而言,用户希望系统推荐的某类东西有一定的多样性,也就是有差异,比如颜色,款式等。
5、新颖度:商品给用户的新鲜感(推荐其不知道的商品)
6、惊喜度:与用户的历史兴趣不相似,但是用户确满意的
7、信任度:提供可靠的推荐理由
8、实时性:实时更新程度
协同过滤是一种基于近邻的推荐算法,是根据用户在物品上的行为找到物品或用户的“近邻”。
用户在物品上的行为 ——> 同类用户/同一用户可能喜欢的不同物品
基于用户有共同行为的物品,计算用户的相似度,找到“近邻”用户,对其近邻在新物品上的评价进行加权推荐。
示例:
同样是对电影评分进行预估,可以通过求列和列之间的相似度,也就是用户和用户之间的相似度,来判定某些相似的用户,从而从和他相似的用户中预估其对电影的打分。
假如用户5和用户3、10的相似度较高,则用用户3和10对第一个电影的评分的加权平均作为用户5对电影1的评分。
基于有相同用户交互的物品,计算物品相似度(A和B),找到物品的近邻(B),对其他喜欢A的用户做推荐。
假设有两种商品A和B,则同时喜欢两者的人群可能是相似性较高的,所以可以判定A和B的相似性应该是接近的,故可以把B推荐给喜欢A的人群。
示例:对空白处进行预估
空白填充的目的:为了根据用户已打分的电影,推断出其没看过的电影的评分,预估出评分之后,按大小排序,推荐预估分数高的电影。
求行和行之间的相似度:
工业界对基于物品的协同过滤用的更多,因为:
用户的评分矩阵有的位置是空着的,我们希望尽量正确的填满未打分的项。
肯定会有一些隐藏的因素会影响用户的打分,不一定是人可以直接理解的隐藏因子,但是总会是由些因素影响了你的打分,所以,我们找到隐藏因子,可以对用户和商品进行关联。**
隐语义模型:寻找可能影响用户打分的隐藏因子
隐藏因子个数小于用户和商品数,因为如果每个user都对应一个独立的隐藏因子,就没法做预测了。
假如一个电影刚好不是战争片(得分-1),而用户刚好不喜欢战争片(-1),两者相乘刚好是1,刚好匹配。
如何对物品进行分类,分成几类?
如何确定用户对哪些物品类别有兴趣,兴趣程度如何?
对于一个给定的类,选择这个类中的哪些物品进行推荐,如何确定物品在某个类别中的权重?
隐语义模型在显性反馈数据(也就是评分数据)上能解决评分预测问题并达到了很好的精度。不过推荐系统主要讨论的是隐性反馈数据集,这种数据集的特点 是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)。那么,在隐性反馈数据集上应用隐语义模型解决推荐的第一个关键问题就是如何 给每个用户生成负样本。我们发现对负样本采样时应该 遵循以下原则:
对每个用户,要保证正负样本的平衡(数目相似);
每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品:一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物 品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣;
假设:
求解:
(1)传统奇异值分解SVD用于推荐
可以将这个用户物品对应的m×n矩阵M进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维,也就是说矩阵M此时分解为r如下,通过这种方法,我们可以将评分表里面所有没有评分的位置得到一个预测评分。通过找到最高的若干个评分对应的物品推荐给用户:
SVD的限制:要补值
SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空白。有空白时我们的M是没法直接去SVD分解的。
传统SVD采用的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。
SVD的时间复杂度为O(m^3),用户数和物品一般都是超级大,随便就成千上万了。这么大一个矩阵做SVD分解是非常耗时的。
(2)FunkSVD算法用于推荐
FunkSVD如何将矩阵M分解为P和Q呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。
如何找到矩阵P/Q的最佳参数:随机初始化之后,利用梯度下降法优化损失函数
下式为正则项:
对两组未知数求偏导:
利用随机梯度下降法得到递推公式:
其中α是在梯度下降的过程中的步长(也可以称作学习速率),这个值不宜过大也不宜过小,过大会产生震荡而导致很难求得最小值,过小会造成计算速度下降,需 要经过试验得到最合适的值。
迭代最终会求得每个用户对于每个隐分类的喜爱程度矩阵P和每个物品与每个隐分类的匹配程度矩阵Q。
在用户对物品的偏好信息矩阵R 中,通过迭代可以求得每个用户对每个物品的喜爱程度,选取喜爱程度最高而且用户没有反馈过的物品进行推荐,也就是还原矩阵的未打分项。
在隐语义模型中,重要的参数有以下4个:
1)隐分类的个数F;
2)梯度下降过程中的步长(学习速率)α;
3)损失函数中的惩罚因子λ;
4)正反馈样本数和负反馈样本数的比例ratio;
这四项参数需要在试验过程中获得最合适的值.1)3)4)这三项需要根据推荐系统的准确率、召回率、覆盖率及流行度作为参考, 而2)步长α要参考模型的训练效率。
(3) BiasSVD算法用于推荐
BiasSVD假设评分系统包括三部分的偏置因素:
假设评分系统平均分为μ,第i个用户的用户偏置项为bi,而第j个物品的物品偏置项为bj,则加入了偏置项以后的优化目标函数J(p,q)是这样的
这个优化目标也可以采用梯度下降法求解。和FunkSVD不同的是,此时我们多了两个偏执项bi,bj,,pi,qj的迭代公式和FunkSVD类似,只是每一步的梯度导数稍有不同而已,这里就不给出了。而bi,bj一般可以初始设置为0,然后参与迭代。这里给出bi,bj的迭代方法
通过迭代我们最终可以得到P和Q,进而用于推荐。BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。
FunkSVD将矩阵分解用于推荐方法推到了新的高度,在实际应用中使用也是非常广泛。当然矩阵分解方法也在不停的进步,目前张量分解和分解机方法是矩阵分解推荐方法今后的一个趋势。
对于矩阵分解用于推荐方法本身来说,它容易编程实现,实现复杂度低,预测效果也好,同时还能保持扩展性。这些都是它宝贵的优点。当然,矩阵分解方法有时候解释性还是没有基于概率的逻辑回归之类的推荐算法好,不过这也不影响它的流形程度。小的推荐系统用矩阵分解应该是一个不错的选择。大型的话,则矩阵分解比起现在的深度学习的一些方法不占优势。