Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184279
  • 博文数量: 13
  • 博客积分: 1660
  • 博客等级: 上尉
  • 技术积分: 688
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-04 16:38
文章分类
文章存档

2014年(2)

2013年(11)

分类: 云计算

2013-01-13 15:20:15

1.协同过滤的主要部分是相似度的计算,直接抽象成物品间距离的计算比较方便理解和计算。
  方法有很多,比如我们都学过的欧几里得,相关性系数,具体公式就不细讲了。真实的推荐系统的计算方式就复杂了,做系统的时候再深入了解好了。
  ps:相关性系数可以修正用户标准不一致问题。比如有人打分苛刻,有人打分偏高导致推荐不一致的问题。

2.存储方式:
这里是一个全矩阵。用双层dict保存。
稀疏矩阵:基于物品的存储空间要远基于用户
密集矩阵:存储空间差不多

如下图是个用户和物品的分数表,中间是分值。 比如user3对item3的打分是3.

 

item1

item2

item3

item4

item5

user1

 1

 3

 2

 5

 1

user2

 2

 3

 3

 4

 2

user3

 3

 4

 3

 5

 3

user4

 1

 2

 2

 5

 1



3.基于用户:这里不考虑对用户分类
A基于用户的协同过滤:通过物品的得分计算----->找到相似的用户---->找该用户的其他物品(这里考虑了你的所有物品加权)

例如user1的v向量=[1,3,2,5,2]
我们将user1的向量和其他三个向量求余弦,或者相关性系数。等到user4的距离最近。
然后我们找user4喜欢的物品,推荐给A

ps:人的兴趣爱好会跟随他的操作而变化,计算量就会比较大,只能尽量做到实时。

4.基于物品
B基于物品的协同过滤:找相似的物品(规则要确定,如同一个作家,同一个分类等),(这里就没有个性化推荐在里面,一物对一物)
例如:计算出item1的相似物品为item5. 对用户推荐item5.

ps:物品的加权计算基本上不会变化。所以可以离线计算,但是需要维护一个物品相似度表


代码实现思路:
---------------calculateSimlarItems()-------------------------------------\
getUsrIDByName(steven)-------->getTopGoryListByUsrID(usrID,limit)------->getSimlarItemsByGoryList(goryList)



基于物品的推荐,需要维持一张物品关系表。基于用户的推荐需要维护一张用户关系表:

1.基于物品推荐的顺序: 人名--------->得到历史物品---------->查表,得到相关物品列表--------->去除无效物品---------->取topN

2.基于用户推荐的顺序: 人名--------->查表,得到相关用户----->获得相关用户的物品------------>去除无效物品---------->取topN












阅读(2089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~