协同过滤相对于集体智慧而言,它从一定程度上保留了个体的特征,就是你的品位偏好,所以它更多可以作为个性化推荐的算法思想。
协同过滤的分类基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。简单的说就是:人以类聚,物以群分。
基于用户的协同过滤对于用户 A,根据用户的历史偏好,计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D推荐给用户 A。
基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。计算物品的相似度矩阵。当物品数量过多时,采用字典存储,如果两个物品同时出现,则对应的字典值加1,类似于计算余弦时的两个向量的积
import math
import numpy as np
#用户-商品矩阵
def item_CF(R):
m, n = R.shape #m行用户*n列电影
for k in range(m):
#每个用户下有有评分过的电影和没有评分过的电影
have_score = [] #有评分项
nohave_score = [] #无评分项
for i in range(n):
if R[k,i]:
have_score.append(i)
else:
nohave_score.append(i)
mpddicts = {}
#计算没有评分项和有评分项之间的相似度
for i in nohave_score:
sums = 0
for j in have_score:
#j表示有评分的项,计算有评分项的用户的相似度
sums += similiar(R[:,i],R[:,j])*R[k,j] #加权相加 相似度*评分 与看过的电影求相似度
mpddicts[i]=sums
sorted__map2list = sorted(mpddicts.items(), key=lambda x: x[1], reverse=True) #按照推荐度从高到低进行排序 返回的是列表
print('对{}用户优先推荐商品编号依次是:'.format(k),end='')
if sorted__map2list:
for i in sorted__map2list:
print(i[0],'该电影的推荐度是',i[1],end=', ') #1 (0,4)
print()
else:
print('该用户所有的电影都看过了无法进行推荐')
#计算电影之间的余弦距离
def similiar(a,b):
x = np.dot(a, b)
y = 0
z = 0
la = len(a)
lb = len(b)
for i in range(la):
y += pow(a[i], 2)
y = math.sqrt(y)
for i in range(lb):
z += pow(b[i], 2)
z = math.sqrt(z)
return x / (y * z)
R = np.array([[1, 1, 1, 1, 0],
[0, 0, 1, 1, 0],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
])
item_CF(R)
代码
相关资料 细节内容https://github.com/ChenaniahMe/codes/tree/main/CF
皮尔逊相关系数pianshen.com/article/6934883524/
https://www.cnblogs.com/qsxbc/p/13833736.html
https://github.com/xingzhexiaozhu/MovieRecommendation/blob/master/ItemCF/ItemCF.py
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)