基于用户的协同过滤推荐笔记(附源代码)

基于用户的协同过滤算法

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)#得到相似度矩阵

用户评分矩阵
基于用户的协同过滤推荐笔记(附源代码)_第1张图片

项目用户矩阵(用户评分矩阵转置)

用户相似度
基于用户的协同过滤推荐笔记(附源代码)_第2张图片

在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,感兴趣值]
基于用户的协同过滤推荐笔记(附源代码)_第3张图片

在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,感兴趣值]
基于用户的协同过滤推荐笔记(附源代码)_第4张图片
数据和详细代码在仓库

你可能感兴趣的:(推荐算法,算法,推荐系统,python)