概述
基于用户的协同过滤算法
1. 数据
使用movielens-100k数据集中的u1.base文件作为实验集
2.实验
在demo1中建立用户-评分矩阵和项目-用户矩阵,根据项亮的《推荐系统实践》中建立倒排表,然后计算用户相似度。
import pandas as pd
import numpy as np
import math
#建立用户-评分矩阵
user_rating = np.zeros((944, 1683))#数据集共943个用户,1682部电影
#print(user_rating)
def Create_User_rating_Table(data):
for it in data:
user_rating[it[0]][it[1]]=it[2]
print(user_rating)
outfile = "F:\协同过滤推荐算法\基于用户\user_rating.csv"
data1=pd.DataFrame(user_rating)
#print(data1.shape)
data1.to_csv(outfile, index=False, header=False)
#建立倒排表
def Create_Item_user_Table(data):
#对用户-评分矩阵进行转置
item_user = np.transpose(data)
#print(item_user)
outfile = "F:\协同过滤推荐算法\基于用户\item_user.csv"
data1 = pd.DataFrame(item_user)
data1.to_csv(outfile, index=False, header=False)
return item_user
#建立相似度矩阵
def Create_Sim_Matrix(item_users):
N = np.zeros(944) # 943位用户的评分数量
C = np.zeros((944,944))#分子
for i in range(1,1683):
for j in range(1,944):#从每一部电影中取出每个用户的评分,若为0则表示该用户没有观看该部电影
if item_users[i][j] != 0:
N[j]+=1
for k in range(1,944):
if item_users[i][k] != 0:
if j==k:
continue
C[j][k]+=1
#计算相似度
W = np.zeros((944,944))
for u in range(1,944):
for v in range(1,944):
if u == v:
continue
W[u][v]=C[u][v]/math.sqrt(N[u]*N[v])
#print(W)
outfile = "F:\协同过滤推荐算法\基于用户\user_sim.csv"
data1 = pd.DataFrame(W)
data1.to_csv(outfile, index=False, header=False)
file="F:\协同过滤推荐算法\ml-100k\u1.base"
lieming=["用户id", "电影id", "评分", "时间"]
data = pd.read_table(file, names=lieming)
#print(data)
list_data = np.array(data)#转换数组
#print(list_data)
data=list_data.tolist()#转换list
#print(type(data))
Create_User_rating_Table(data)
item_users=Create_Item_user_Table(user_rating)
Create_Sim_Matrix(item_users)#得到相似度矩阵
用户评分矩阵
项目用户矩阵(用户评分矩阵转置)
用户相似度
在demo2中利用用户间的相似度,计算用户v对电影i的感兴趣值。
import pandas as pd
import numpy as np
#计算用户u对电影i的感兴趣程度
def Count_User_Interest(Sim_W,K,item_user):
Recommend=[]
for userid in range(1,944):
P=[]
for i in range(1,1683):
cur_user_sim = Sim_W[userid]
cur_sort=[]
#print(cur_user_sim)
for j in range(1,944):#取用户u的K个最近邻和看过电影i的用户之间的交集
if item_user[i][j]!=0:#若用户j看过第i部电影则将用户j和u对j的相似度加入
cur_sort.append([j,cur_user_sim[j]])
#print(cur_sort)
cur_sort.sort(key=(lambda x: x[1]), reverse=True)#逆序
#print(cur_sort[0:K])
sum=0
for user_v in cur_sort[0:K]:
v=user_v[0]
sum+=user_v[1]*item_user[i][v]
P.append([i,sum])
P.sort(key=(lambda x:x[1]), reverse=True)
Recommend.append(P)
print(P)
R=pd.DataFrame(Recommend)
outfile="F:\协同过滤推荐算法\基于用户\Recommend.csv"
R.to_csv(outfile, index=False, header=False)
file="F:\协同过滤推荐算法\基于用户\user_sim.csv"
data=pd.read_csv(file, header=None)#header取消列名
user_sim=np.array(data)
#print(user_sim)
file1="F:\协同过滤推荐算法\基于用户\user_rating.csv"
data1=pd.read_csv(file1,header=None)
user_rating=np.array(data1)
#print(user_rating)
file2="F:\协同过滤推荐算法\基于用户\item_user.csv"
data2=pd.read_csv(file2,header=None)
item_user=np.array(data2)
#print(item_user)
Count_User_Interest(user_sim,30,item_user)#选择30个最近邻进行推荐,生成推荐列表
推荐,[电影id,感兴趣值]
在demo3中将用户对不同电影的感兴趣值进行排序,进行Top-N推荐,选取前N个作为推荐列表。
import pandas as pd
import numpy as np
Top=[]
def Top_N(n):
for item in recommend:
recomm=[]
for it in item:
recomm.append(it)
recomm.sort(key=lambda x:x[1], reverse=True)
print(recomm[0:n])
Top.append(recomm[0:n])
Top_N_data=pd.DataFrame(Top)
outfile="F:\协同过滤推荐算法\基于用户\Top_N.csv"
Top_N_data.to_csv(outfile,index=False,header=False)
file="F:\协同过滤推荐算法\基于用户\Recommend.csv"
data=pd.read_csv(file, header=None)
print(data.shape)
print(data)
data1=np.array(data)
recommend=data1.tolist()
#print(type(recommend))
Top_N(10)#Top-N推荐,N取10
Top-N推荐,[电影id,感兴趣值]
数据和详细代码在仓库
最后
以上就是可耐花生为你收集整理的基于用户的协同过滤推荐笔记(附源代码)基于用户的协同过滤算法的全部内容,希望文章能够帮你解决基于用户的协同过滤推荐笔记(附源代码)基于用户的协同过滤算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复