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
阅读(2210) | 评论(0) | 转发(0) |