关于基于用户过滤和基于物品过滤

原文地址:http://fkysly.com/blog/?p=32

基于用户过滤和基于物品过滤都是协作型过滤(collaborative filtering)中的算法。

协作型过滤通常是在一大群人中找到一小群与我们品味相近的人,或者是一大群物品中找到一小群与当前物品相近的物品。前者是基于用户的,后者是基于物品的。

先讨论基于用户过滤

原理大概是这样的:先准备好数据,然后通过一个相似度评价函数,算出其他用户与当前用户的相似度。相似度实际上就是其他用户的一个权值,权值越高,相似度越高,就说明他的选择对当前用户推荐影响越大。所以我们将权值*其他用户对物品的评分,然后统计最后的和,就可以得到推荐给当前用户的每个物品的一个评分。这个评分是其他用户的加权评分和,这个权值是通过相似度评价函数算出来的。

数据准备
假设我们现在已经有了一组数据,经过我们用语言对其的加工。我们已经将其转化为2维数组。横向坐标是用户,纵向坐标是物品。那么2维数组的内容就是用户对物品的打分。

比如:

………….person1 person2 person3

thing1         4            1            2

thing2         3            8            5

thing3         1            3            2.5

当然,在处理中不一定用2维数组进行处理,比如在python中就可以利用列表进行处理。

我们的数据就准备好了。

构造评价函数

我们有了数据之后,我们的目的是要确定品味相近的群体。我们需要一个相似度评价函数,通过这个函数得到其他用户的权值,再用权值*评分,加权算出来最终推荐给用户的物品评分。

相似度评价函数是可以自己构造的。本文介绍两种:欧几里德距离评价函数,皮尔逊评价函数

欧几里得距离评价函数

其实欧几里得评价函数就是以n个物品建立个n维的坐标系。这样一个用户在这个坐标系里的坐标就是一个n维元组(对物品1的评价分数,对物品2的评价分数,…,对物品n的评价分数)。以上面的数组为例:就是一个三维的坐标系,person1的坐标就是(4,3,1)。person2的坐标就是(1,8,3)。

这样每两个人之间就会有个空间的距离。这个是很简单的空间距离的数学知识了。

比如上例:sqrt[(4 - 1) ^ 2 + (3 - 8) ^ 2 + (1 - 3) ^ 2]。

具体可参见:http://baike.baidu.com/view/1104188.htm

这样算出来的距离值越短表示两个人越相似。但是我们往往希望值越大表示越相似。这里有个很简单的解决方法:求倒数。

ans = 1 / ( 1 + x ) 。其中ans是最终的值,x是距离值,为了防止分母为0, 我们加了1.

这样ans是介于0到1之间的值。这就是我们要的评价值了。这个函数可以构造出来,也就是欧几里得距离评价函数

皮尔逊评价函数

皮尔逊要稍微复杂一点。但是在数据不是很规范,有异常数据的时候,很有用。

这一次不是再以物品构建坐标系了。是以要比较的两个人构建一个2维坐标系。然后坐标系当中的点就是评价的物品。

继续用上例:person1, person2为横纵坐标构建一个2维的坐标系。那么每个物品都会有个坐标(person1对其的打分,person2对其的打分)。比如thing1的坐标就是(4,1)。thing2的坐标就是(3,8)。thing3的坐标就是(1,3)。

所有的物品都会在坐标系上有个点来表示。思考一下,假如两个人对每个物品打分都一样,那么将会是y=x这个函数,也就是一条45度的对角线。假如两个人打分有点偏差,那么就会是一条斜线,至于角度是多少完全依赖于两个人打分的差距。但是这里要注意一点,如果两个人对每个物品的打分差都是一样的,那么仍然是45度的对角线,只不过是平移了一下,这样算出来的评价值是和两个人打分相同情况的值是一样的。

这里具体的值是怎么算出来的,其实是统计学当中的一个皮尔逊相关系数,比较复杂的公式:http://baike.baidu.com/view/779030.htm

生成最终的物品推荐分数

我们有了数据,有了评价函数。我们就可以进行物品推荐了。也就是我们传入一个用户作为参数,然后通过评价函数,将用户和其他所有用户都算出来一个评价值,也就是他对当前推荐的影响程度。其他的每个用户对每个物品都会有个分数,对于每个物品来说,最终的推荐分数=每个用户的评价值*他对物品的分数。

仍然用上例:假设我们是希望得到person3的一个物品推荐列表。

我们就是先用评价函数算出来person3与person1、person2的一个评价值x1,x2。这个只要利用评价函数就可以了。

得到评价值之后,对于每个物品都想得到最终的推荐分数。

对于thing1最终的推荐分数应该是person1的评价值x1 * person1对thing1的打分4再加上person2的评价值x2 * person2对thing1的打分1。也就是x1*4+x2*1

同理得到thing2的最终推荐分数是x1*3+x2*8

这样把最终的推荐分数按照从大到小排序,依次就是最适合当前用户的物品了。

 

基于物品过滤

到现在为止,一直在说基于用户过滤。实际上,基于物品过滤只不过是将上文的物品和用户换下为止。把物品当做用户,把用户当做物品而已。然后找到每个物品最相近品味的物品。这样如果有个新用户需要推荐,只要把他之前评过分的物品,从中选出排位靠前者,找到那些物品相近品味的物品推荐给用户就可以了。

好处是,找相近品味的物品这一步,不需要即时的算出来。因为物品相似受到已有的数据影响已经比较稳定了,可以每个小时更新一次数据库,这个数据库可以独立的放出来运算的。这样就比基于用户过滤好一点。

总结

协作型过滤分为基于用户过滤和基于物品过滤。两种过滤方法基本相似。最大的不同在于后者不需要即时的算出来,这样在有大数据的情况下,可以作为独立的数据库分离出来。这个具体还是视数据的稀疏情况而定。

 

本文大部分知识来自于《集体智慧编程》,详细请参照书本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值