采用ml-100k数据集用Python实现电影推荐系统

最近在python从入门放弃的路上,做了用MovieLens(ml-100k)数据集的电影推荐系统,主要基于Pearson相关系数判断数据集中其他用户与目标用户的相似性,取其中最相似的50个用户加权计算其推荐系数,排序后推荐得分最高的10部电影。
以下是具体实现过程:

0.准备

我们首先得了解数据集的标签,毕竟年代久远直接读来有点困难我查找了一下资料得到了以下信息:
u.data: 完整的数据集文件,包含943位用户对1682部电影的100000个评分
评分1—5
每个用户至少20部
u.info: 用户数、项目数、评价总数
u.item: 电影的信息,由tab字符分隔。
u.genre: 电影流派信息0-18编号
u.user: 用户基本信息。id,年龄,性别,职业,邮编,id与u.data一致

1.首先载入数据集文件,u.data与电影名称文件u.item。
def loadData():
    f = open('u.data')
    data = []
    for i in range(100000):
        h = f.readline().split('\t')
        h = list(map(int, h))
        data.append(h[0:3])
    f.close()
    return data

def loadMovieName():
    f=open('u.item',encoding='ISO-8859-1')
    name = []
    for i in range(1682):
        h = f.readline()
        k=''
        m=0
        for j in range(100):
            k+=str(h[j])
            if str(h[j])=='|':
                m+=1
            if m==2:
                break
        name.append(k)
    f.close()
    return name

这里我在载入电影名称时出现了编码问题,gbk编码没办法读这个文件,需增加“encoding=‘ISO-8859-1’”。

2.整合与处理数据

通过了解了标签信息我们就可以编写函数将其处理成以每行为一个用户对所有电影一一对应评分的一个列表或者说943*1682的矩阵。

def manageDate(data):
    outdata = []
    for i in range(943):
        outdata.append([])
        for j in range(1682):
            outdata[i].append(0)
    for h in data:
        outdata[h[0] - 1][h[1] - 1] = h[2]
    return outdata
3.计算相关系数

这一步主要分为两步三个函数,先求向量也就是列表均值,后求相关系数。

def calcMean(x, y):
    sum_x = sum(x)
    sum_y = sum(y)
    n = len(x)
    x_mean = float(sum_x + 0.0) / n
    y_mean = float(sum_y + 0.0) / n
    return x_mean, y_mean


def calcPearson(x, y):
    x_mean, y_mean = calcMean(x, y)  # 计算x,y向量平均值
    n = len(x)
    sumTop = 0.0
    sumBottom = 0.0
    x_pow = 0.0
    y_pow = 0.0
    for i in range(n):
        sumTop += (x[i] - x_mean) * (y[i] - y_mean)
    for i in range(n):
        x_pow += math.pow(x[i] - x_mean, 2)
    for i in range(n):
        y_pow += math.pow(y[i] - y_mean, 2)
    sumBottom = math.sqrt(x_pow * y_pow)
    p = sumTop / sumBottom
    return p


def calcAttribute(dataSet, num):
    prr = []
    n, m = np.shape(dataSet)  # 获取数据集行数和列数
    x = [0] * m  # 初始化特征x和类别y向量
    y = [0] * m
    y = dataSet[num - 1]
    for j in range(n):  # 获取每个特征的向量,并计算Pearson系数,存入到列表中
        x = dataSet[j]
        prr.append(calcPearson(x, y))
    return prr
4.选择电影

我们采用开头提到的策略取其中最相似的50个用户加权计算其推荐系数,排序后推荐得分最高的10部电影。

def choseMovie(outdata, num):
    prr = calcAttribute(outdata, num)
    list=[]
    mid=[]
    out_list=[]
    movie_rank=[]
    for i in range(1682):
        movie_rank.append([i,0])
    k=0
    for i in range(943):
        list.append([i,prr[i]])
    for i in range(943):
        for j in range(942-i):
            if list[j][1]<list[j+1][1]:
                mid=list[j]
                list[j]=list[j+1]
                list[j+1]=mid
    for i in range(1,51):
        for j in range(0,1682):
            movie_rank[j][1]=movie_rank[j][1]+outdata[list[i][0]][j]*list[i][1]/50
    for i in range(1682):
        for j in range(1681-i):
            if movie_rank[j][1]<movie_rank[j+1][1]:
                mid=movie_rank[j]
                movie_rank[j]=movie_rank[j+1]
                movie_rank[j+1]=mid
    for i in range(1,1682):
        if(outdata[num-1][movie_rank[i][0]]==0):
            mark=0
            for d in out_list:
                if d[0]==j:
                        mark=1
                if mark!=1:
                    k+=1
                    out_list.append(movie_rank[i])
            if k==10:
                break
    return movie_rank

这里返回的是推荐电影的索引与评分。

5.输出

这里简单的输出了电影名称与推荐评分。

def printMovie(out_list,name):
    print("base on the data we think you may like those movies:")
    for i in range(10):
        print(name[out_list[i][0]]," rank score:",out_list[i][1])

运行结果如下图所示:
在这里插入图片描述

下面给出完整代码:

import numpy as np
import math


def loadData():
    f = open('u.data')
    data = []
    for i in range(100000):
        h = f.readline().split('\t')
        h = list(map(int, h))
        data.append(h[0:3])
    f.close()
    return data

def loadMovieName():
    f=open('u.item.txt',encoding='ISO-8859-1')
    name = []
    for i in range(1682):
        h = f.readline()
        k=''
        m=0
        for j in range(100):
            k+=str(h[j])
            if str(h[j])=='|':
                m+=1
            if m==2:
                break
        name.append(k)
    f.close()
    return name


def manageDate(data):
    outdata = []
    for i in range(943):
        outdata.append([])
        for j in range(1682):
            outdata[i].append(0)
    for h in data:
        outdata[h[0] - 1][h[1] - 1] = h[2]
    return outdata


def calcMean(x, y):
    sum_x = sum(x)
    sum_y = sum(y)
    n = len(x)
    x_mean = float(sum_x + 0.0) / n
    y_mean = float(sum_y + 0.0) / n
    return x_mean, y_mean


def calcPearson(x, y):
    x_mean, y_mean = calcMean(x, y)  # 计算x,y向量平均值
    n = len(x)
    sumTop = 0.0
    sumBottom = 0.0
    x_pow = 0.0
    y_pow = 0.0
    for i in range(n):
        sumTop += (x[i] - x_mean) * (y[i] - y_mean)
    for i in range(n):
        x_pow += math.pow(x[i] - x_mean, 2)
    for i in range(n):
        y_pow += math.pow(y[i] - y_mean, 2)
    sumBottom = math.sqrt(x_pow * y_pow)
    p = sumTop / sumBottom
    return p


def calcAttribute(dataSet, num):
    prr = []
    n, m = np.shape(dataSet)  # 获取数据集行数和列数
    x = [0] * m  # 初始化特征x和类别y向量
    y = [0] * m
    y = dataSet[num - 1]
    for j in range(n):  # 获取每个特征的向量,并计算Pearson系数,存入到列表中
        x = dataSet[j]
        prr.append(calcPearson(x, y))
    return prr


def choseMovie(outdata, num):
    prr = calcAttribute(outdata, num)
    list=[]
    mid=[]
    out_list=[]
    movie_rank=[]
    for i in range(1682):
        movie_rank.append([i,0])
    k=0
    for i in range(943):
        list.append([i,prr[i]])
    for i in range(943):
        for j in range(942-i):
            if list[j][1]<list[j+1][1]:
                mid=list[j]
                list[j]=list[j+1]
                list[j+1]=mid
    for i in range(1,51):
        for j in range(0,1682):
            movie_rank[j][1]=movie_rank[j][1]+outdata[list[i][0]][j]*list[i][1]/50
    for i in range(1682):
        for j in range(1681-i):
            if movie_rank[j][1]<movie_rank[j+1][1]:
                mid=movie_rank[j]
                movie_rank[j]=movie_rank[j+1]
                movie_rank[j+1]=mid
    for i in range(1,1682):
        if(outdata[num-1][movie_rank[i][0]]==0):
            mark=0
            for d in out_list:
                if d[0]==j:
                        mark=1
                if mark!=1:
                    k+=1
                    out_list.append(movie_rank[i])
            if k==10:
                break
    return movie_rank

def printMovie(out_list,name):
    print("base on the data we think you may like those movies:")
    for i in range(10):
        print(name[out_list[i][0]]," rank score:",out_list[i][1])


i_data = loadData()
name = loadMovieName()
out_data = manageDate(i_data)
a = eval(input("please input the id of user:"))
out_list = choseMovie(out_data, a)
printMovie(out_list,name)
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值