5.2 基于朴素贝叶斯的推荐算法
利用概率方法来构建算法模型为用户做推荐,可以将预测评分问题看成一个分类问题,即将可能的评分离散化为有限个离散值(比如1、2、3、4、5一共5个可行的分值),那么预测用户对某个标的物的评分,就转化为用户在该标的物上的分类了(比如分为5个类别,这里不考虑不同类之间的有序关系)。本节就利用最简单的贝叶斯分类器来进行个性化推荐。
假设一共有k个不同的预测评分,我们记为S={s1,s2,s3,…,sk},所有用户对标的物的评分构成用户行为矩阵Rn×m,该矩阵的(u,i)元素记为rui,即用户u对标的物i的评分,取值为评分集合S中的某个元素。下面讲解怎么利用贝叶斯公式为用户u做推荐。
假设用户u有过评分的所有标的物记为Iu,Iu={i|rui∈S}。现在我们需要预测用户u对未评分的标的物j的评分ruj(ruj∈S)。可以将这个过程理解为在用户已经有评分记录Iu的条件下,用户对新标的物j的评分ruj取集合S中某个值的条件概率:
条件概率P(A|B),表示的是在事件B发生的情况下事件A发生的概率,基于贝叶斯定理,条件概率可以通过如下公式来计算:
因此,回到上面的推荐问题,∀p∈{1,2,3,…,k},我们有
这里需要确定具体的p值,让上式左边中有评分记录的标的物)的值最大,这个最大的值对应的sp就可以作为用户u对未评分的标的物j的评分(ruj=sp)。我们注意到上式右边分母的值与具体的p无关,因此右边分子值的大小才是最终决定公式左边值的相对大小的关键,基于该观察,可以将上式记为:
现在的问题就是如何估计上式右边项的值,实际上基于用户评分矩阵,这些项的值是比较容易估计出来的,方法如下。
1)估计P(ruj=sp)。
P(ruj=sp)其实是ruj的先验概率,我们可以用标的物j评分为sp的用户比例来估计该值,即
这里分母是所有对标的物j有过评分的用户,而分子是将标的物j评分为sp的用户。
2)估计P(在Iu中有评分记录的标的物|ruj=sp)。
要估计P(在Iu中有评分记录的标的物|ruj=sp),需要先做一个朴素的假设,即条件无关性假设:用户u所有的评分Iu是独立无关的,也就是不同的评分之间是没有关联的,互不影响(该假设也是该算法称为朴素贝叶斯的由来)。实际上,同一用户对不同标的物的评分可能是有一定关联的,在这里做这个假设是为了计算方便,在实际使用朴素贝叶斯做推荐时效果还是很不错的,泛化能力也可以。
有了条件无关性假设,P(在Iu中有评分记录的标的物|ruj=sp)就可以用如下公式来估计了:
而P(rui|ruj=sp)可用对标的物j评分为sp的所有用户中对标的物i评分为rui的比例来估计。即
有了上面的两个估计,我们利用朴素贝叶斯来计算用户对标的物的评分概率问题最终可以表示为
上式就是用户对标的物评分的概率估计,一般来说,我们可以采用两种方法来估计ruj的值。
1.类似极大似然的思路估计
该方法就是用∀p∈{1,2,3,…,k},使得中有评分记录的标的物)取值最大的p对应的sp作为ruj的估计值,即
该方法仅仅将用户对标的物的评分看作类别变量而忽略具体评分的数值,而下面的方法则利用了评分的具体数值。
2.采用加权平均来估计
用户u对标的物j的估计可以取{s1,s2,s3,…,sk}中的任一值,基于式(5-1),取每一个值都有一个概率估计P(ruj=sp|在Iu中有评分记录的标的物),那么最自然的方式是可以用这个概率作为权重,利用加权平均来估计,具体的估计公式如下:
有了用户对标的物评分的估计,推荐就是顺其自然的事情了。具体来说,我们可以计算出用户对所有未评分标的物的估计值,再按照估计值的大小降序取topN作为给用户的推荐。这里说明一下,对于采用极大似然思路的估计(即上面的第一种估计方法),因为该方法是将评分看成类别变量,那么肯定有很多标的物的估计值是一样的,这时如果需要再区别这些评分一样的标的物,可以采用估计该值时的概率大小,再进行二次排序。
采用贝叶斯方法来做推荐会存在一些问题,具体来说,我们在估计P(ruj=sp)和P(在Iu中有评分记录的标的物|ruj=sp)时,由于样本数据稀疏,会导致无法进行估计或者估计值鲁棒性不足的问题。比如在估计P(ruj=sp)时,我们用公式
来估计,从该式可以看到,如果无用户或者很少用户对标的物j有评分(这种情况是存在的,如j是新加入的标的物或者是冷门标的物),这时可能会出现用0/0来估计的情况,即使不是0/0,当分子分母都很小时,估计值的波动也会很大,不够鲁棒,对估计结果影响很大。一般我们可以采用拉普拉斯平滑(Laplacian Smoothing)的方法来处理,得到更加稳定的估计值。
针对上面这个例子,下面介绍如何利用拉普拉斯平滑来处理:假设n1,n2,…,nk是对标的物j评分分别为s1,s2,…,sk的用户数,那么上面的估计就是
增加拉普拉斯平滑后的估计公式就是
从这个公式可以看出,当没有用户对标的物j评过分时,就用1/k来估计,这是在没有已知信息的情况下比较合理的估计。上式中α是光滑化因子,α值越大,估计越光滑(鲁棒性越好),这时公式对数据就不够敏感。对于P(在Iu中有评分记录的标的物|ruj=sp)的估计,也可以采用一样的方法,这里不再赘述。
到此为止,我们讲完了怎么利用朴素贝叶斯来为用户做推荐,该方法也是只利用了用户的操作行为矩阵,所以也是一种协同过滤算法。
朴素贝叶斯方法是一个非常简单直观的方法,工程实现也非常容易,易于并行化。它对噪声有一定的“免疫力”,不太会受到个别评分不准的影响,并且也不易于过拟合(个人觉得前面介绍的条件无关性假设是泛化能力强的主要原因),一般情况下预测效果还不错,并且当用户行为不多时,也可以使用(需要利用拉普拉斯平滑来处理),而不像矩阵分解等算法,需要大量的用户行为才能进行推荐。