之前看过网上的一些简单的slopeOne算法的介绍,基于那样的算法进行推荐的话不是很科学,很可能会出现一些极端人 士的极端评分而后为我们推荐极端不相似的物品。这里要讲的这种slope算法引入了诸多的数学知识,比如权重、方差、标准差等等,这里简单说一下这些概 念:权重是为了突出某个项的一个指标,如果某个东西优先考虑,可以将该东西乘以为它准备的权重值,在solr中权重体现的很多(可以实现排序靠前),当然 在分布式数据库中也可以使用权重来实现读写分离;方差主要是为了用来计算标准差;标准差是为了反映某个东西它离一个标准到底有多远,例如我们以扶老奶奶过 马路来衡量一个人的品行,有些人经常扶老奶奶过马路,和老奶奶一起走,可有些人过马路时却比老奶奶走的快,我们会称后者离老奶奶的距离太远,也就不会将那 些人介绍给我们当朋友,标准差的意思也就是这么个意思。好了,不扯了,具体来讲讲slopeOne算法。 对于推荐系统来讲,我们经常会需要为一个user推荐这个user不感兴趣的item,换句话就是说该user-item对没有出现在推荐系统中,这时候我们需要在推荐之前将所有用户感兴趣的item的得分进行计算平均分,方差,标准差。比如:有一下三组数据: User1 item1 0.1,user1 item2 0.2,user1 item3 0.3,user1 item4 0.4 User2 item2 0.3,user2 item3 0.5,user2 item4 0.1 User3 item1 0.6 user3 item3 0.4 这时候通过计算最后得到的数据结构是这样的: {item1= {item2=average12,item3=average13,item4=average14},item2= {item3=average23,item4=average24}},其中average值中包括count(如item1和item2对的数量,平 均分,标准差,方差) 那么这些average12等数据时如何计算出来的呢?下面就来讲讲它的计算思路。 我 们可以看到user1对item1,2,3,4感兴趣,user2对item2,3,4感兴趣,user3对item1,3,4感兴趣,那么 average12的值是使用0.2-0.1的值去计算标准差和平均分,average13的值使用0.3-0.1和0.4-0.6(因为user3也对 item1,3感兴趣)这两个值去计算标准差和平均分,这时候得到的count就为2,以此类推,其他的相似,其实就一句话,我们要遍历所有的用户进行计 算,遇到相同的就将差值传递给average去计算。对于数据结构和算法不是很敏感的同学计算这个average值的过程是很麻烦的,好在搜索引擎帮我们 解决了,但是搜到的结果都只是将所有的数据组织好一起扔到方法里去计算,我们这里的情况不一样,我们是一个数据一个数据的扔的,所以我们需要将前一次的计 算结果进行缓存保存起来,下次计算再在上次的缓存结果的基础上进行累加计算。有了这些值之后我们就可以进行推荐了。 比 如我要向user3推荐item,很简单的就可以看出可以为user3推荐的有item2和item4,如果你的应用明确告诉推荐引擎只需要推荐一个结 果,那么这时我们就需要去推断item2和item4的得分谁高了,推算得分我们需要从上面的数据结构取出average12和average23(因为 user3感兴趣的是item1,3,我们需要推荐的是item2),我们循环取出的average12和average23,通过上面我们可以知道 average12和average23的count值都为2,如果还有一个user4也对item2,3感兴趣,那么average23的count值 就为3了。这里的count就将会被作为权重来计算(系统中相同的item越多,权重当然就越高)。但是如果你的average中含有标准差,那么权重就 需要进行相应的调整了,为了将标准差反映在推算得分中,我们可以讲标准差应用到权重的计算当中,如:权重=权重/(1+标准差)(这种数学模型想必大家在 多处已经看到过),这里标准差越大,权重越低,这刚好符合我们的需求。这时候得分就可以以这种形式计算:得分=权重(user3对item1的评 分+average12的分数),这时什么意思呢?因为我们是要推算user3对item2的得分,所以将user3对item1的评分和 average12的分数(item1和item2之间的平均分)相加乘以item1和item2之间的权重值,当然我们还要加上将user3对 item3的评分和average23的分数(item2和item3之间的平均分)相加乘以item2和item3之间的权重值的结果,我们称此结果为 totalScore,如果还有average24则还需要计算并相加。最后user3对item2的评分就可以推算为 totalScore/totalWeight,以这里我们的例子为例,最后的推算分数为: estimateScore=((0.6+average12)2+(0.4+average23)*2)/4。 本文中的此种算法主要是对简单的slopeOne算法的简单变种,目的是为了让推荐更加的精确,从而加上了权重和标准差等概念。