基于用户的协同过滤和基于物品的协同过滤,基于协同过滤算法
Yyds干货库存
一、数据准备刘一,3,1001
陈二,41001
张三,31001
李四,31001
刘一,31002
李四,41002
刘一,41003
张三,51003
李四,51003
刘一,41004
张三,31004
刘一,51005二。计算项目间的共现矩阵。调整以上数据,由用户整理。
用户评价的项目(BookId)
然后,计算文章和文章的共现矩阵中的每一个元素。
001和1002,都是刘一和李四购买的,所以他们的总现值是2。
001和1003,是刘一、张三和李四同时购买的,所以他们的总现值是3。
001和1004,都是刘一和张三购买的,所以他们的总现值是2。
001和1005,它们是刘一同时购买的,所以它们的总现值是1。
002和1003,都是刘一和李四购买的,所以他们的总现值是2。
002和1004,它们是刘慧怡同时购买的,所以它们的总现值是1。
002和1005,它们是刘慧怡同时购买的,所以它们的总现值是1。
003和1004,它们是刘一和张三同时购买的,所以它们的总现值是2。
1003和1005,它们是刘慧怡同时购买的,所以它们的总现值是1。
1004和1005,它们是刘慧怡同时购买的,所以它们的总现值是1。
最后,得到的共生矩阵为
3.计算有多少不同的用户购买了商品。刘一、陈二、张三和李四买了1001。
刘一和李四买了1002。
刘一、张三和李四买了1003。
刘一和张三买了1004。
刘一买了1005。
四。计算相似度矩阵两个项目的余弦相似度计算公式为:
根据这个公式,
001和1002的相似度是2/sqrt(4 * 2)=0.707。
001和1003的相似度是3/sqrt(4 * 3)=0.866。
001和1004的相似度是2/sqrt(4 * 2)=0.707。
1001和1005的相似度是1/sqrt(4 * 1)=0.5。
002和1003的相似度是2/sqrt(2 * 3)=0.816。
1002和1004的相似度是1/sqrt(2 * 2)=0.5。
002和1005的相似度是1/sqrt(2 * 1)=0.707。
003和1004的相似度是2/sqrt(3 * 2)=0.816。
003和1005的相似度是1/sqrt(3 * 1)=0.577。
004和1005的相似度是1/sqrt(2 * 1)=0.707。
因此,相似性矩阵为
假设K=3
(1)对于李四买的1001,相似度最高的前3项及其分值为:
1003,0.866
1002,0.707
1004,0.707
这三件物品中,只有1004从未被李四买过,其推荐值为
1004和1001的相似度*李四对1001的评分=0.707 * 3=2.121
(2)对于李四买的1002,相似度最高的前3项及其分值分别为:
1003,0.816
1001,0.707
1005,0.707
这三件物品中,只有1005从未被李四买过,其推荐值为
1005和1002的相似度*李四对1002的评分=0.707 * 4=2.828
(3)李四买的1003,相似度前3位的物品及其分值分别是:
1001,0.866
1002,0.816
1004,0.816
这三件物品中,只有1004从未被李四买过,其推荐值为
1004和1003的相似度*李四对1003的评分=0.816 * 5=4.08
总结一下,可以推荐给李四的书有
代码:
#!/usr/bin/env python
#-*-编码:utf-8-*-
导入数学
导入pdb
类ItemBasedCF:
def __init__(self,train_file):
self.train_file=火车文件
self.readData()
定义读取数据(自身):
#读取文件并生成用户项目评级表和测试集。
self.train=dict()
#项目的用户评分等级
对于打开的行(self.train_file):
user,score,item=line.strip()。拆分(,)
self.train.setdefault(用户,{})
self . train[user][item]=int(float(score))
定义项目相似性(自身):
#构建项目-项目共现矩阵
COO ccur=dict()# Item-项目的共现矩阵
Buy=dict() #有多少不同的用户购买了物品n
对于用户,self.train.items()中的项目:
对于items.keys()中的I:
buy.setdefault(i,0)
buy[i]=1
cooccur.setdefault(i,{})
对于items.keys()中的j:
如果i==j:继续
cooccur[i]。setdefault(j,0)
cooccur[i][j]=1
#计算相似性矩阵
self.similar=dict()
对于I,cooccur.items()中的related_items:
self.similar.setdefault(i,{})
对于j,cij in related_items.items():
self . similar[I][j]=cij/(math . sqrt(buy[I]* buy[j]))
回归自我
#给用户用户推荐,前K个相关用户,前普通个物品
极好的推荐(自己,用户,K=3,N=10):
rank=dict()
action _ item=self。火车[用户]
#用户用户产生过行为的项目和评分
对于item,action_item.items()中的分数:
已排序项目=已排序(自身。类似的[项目].items(),key=lambda x:x[1],reverse=True)[0:K]
对于sortedItems中的j,wj:
if j in action_item.keys():
继续
rank.setdefault(j,0)
等级[j]=分数* wj
return dict(sorted(rank.items(),key=lambda x:x[1],reverse=True)[0:N])
#声明一个ItemBasedCF的对象
item=基于项目的cf( item _ book。txt’)
项目。项目相似性()
recommedDict=item .推荐(李四)
对于推荐字典。项目()中的k,v:
print(k, \t ,v)运行结果:
1004 6.203803248198273
1005 2.82842712474619
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。