《基于 PySpark 的电影推荐系统分析及问题解决》

news2024/11/19 15:07:31

以下是一篇关于上述代码的博客文章:

基于PySpark的电影推荐系统实现与分析

在当今数字化时代,个性化推荐系统在各个领域中都发挥着至关重要的作用,尤其是在娱乐行业,如电影推荐。本文将详细介绍如何使用PySpark构建一个简单的电影推荐系统,并对代码进行深入分析。

一、环境准备

在开始我们的电影推荐之旅前,需要正确配置运行环境。这涉及到设置一系列的环境变量,确保PySpark能够顺利运行。

os.environ['JAVA_HOME'] = 'C:/Program Files/Java/jdk1.8.0_241'
os.environ['HADOOP_HOME'] = 'D:/hadoop-3.3.1'
os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
os.environ['HADOOP_USER_NAME'] = 'root'
os.environ['file.encoding'] = 'UTF-8'

这里,我们指定了Java的安装路径、Hadoop的路径、Python解析器路径以及一些其他相关的环境变量。这些设置是为了让PySpark能够找到所需的依赖和正确处理数据编码等问题。

二、创建SparkSession

SparkSession是使用PySpark的入口点,它允许我们与Spark集群进行交互并执行各种数据处理操作。

spark = SparkSession.builder.appName("电影推荐案例")\
   .master("local[*]").config("spark.sql.shuffle.partitions","4").getOrCreate()

通过builder模式,我们为这个Spark应用程序命名为“电影推荐案例”,并设置运行模式为本地(local[*],表示使用本地所有可用核心),同时配置了spark.sql.shuffle.partitions的值为4。这个参数控制了在数据混洗(shuffle)操作时的分区数量,会影响数据处理的性能和资源分配。

三、数据读取与处理

我们从一个文本文件中读取用户对电影的评分数据。

df1 = spark.read.text("../../../data/input/u.data")
df1.printSchema()
print(df1.take(10))

这里读取的数据格式是简单的文本文件,通过printSchema可以查看数据的结构(此时数据只有一个名为value的字符串列),take(10)则可以查看前10行数据内容。

接下来,我们需要对读取的数据进行处理,将每行数据按照制表符(\t)进行切割,并转换为包含userIdmovieIdscore三列的DataFrame。

def split_data(line):
    arr = line.split("\t")
    return (int(arr[0]), int(arr[1]), int(arr[2]))
df2 = df1.rdd.map(lambda row: split_data(row.value)).toDF(["userId", "movieId", "score"])
print(df2.take(1))

在这个过程中,我们首先定义了split_data函数,用于解析每行数据。然后通过rdd.map操作将df1中的每行数据应用split_data函数进行转换,最后将结果转换为指定列名的DataFrame。

四、数据划分

为了训练和评估我们的推荐模型,需要将数据划分为训练集和测试集。

train_data, test_data = df2.randomSplit([0.8, 0.2])

这里使用randomSplit方法将df2中的数据按照80%和20%的比例随机划分为训练集和测试集。这种随机划分可以保证数据的随机性,使得训练出的模型更具泛化能力。

五、ALS模型训练

交替最小二乘法(ALS)是一种常用的推荐算法,在我们的电影推荐系统中,我们使用PySpark的ALS实现来训练模型。

als = ALS(userCol="userId",
          itemCol="movieId",
          ratingCol="score",
          rank=10,
          maxIter=10,
          alpha=1.0)
model = als.fit(train_data)

我们指定了userCol(用户ID列)、itemCol(项目,即电影ID列)、ratingCol(评分列)等参数,同时设置了rank(可以理解为模型的潜在因子数量)、maxIter(最大迭代次数)和alpha(步长相关参数)。然后使用训练集train_data对模型进行训练。

六、模型推荐与结果展示

我们可以使用训练好的模型进行多种类型的推荐。

6.1 给所有用户或所有电影推荐

# df3 = model.recommendForAllUsers(5)  # 给所有用户推荐5部电影
# df4 = model.recommendForAllItems(5)  # 给所有电影推荐5个用户
# df3.show(truncate=False)
# df4.show(truncate=False)

这里注释掉的代码展示了可以使用训练好的模型给所有用户推荐指定数量的电影,或者给所有电影推荐指定数量的用户的功能。

6.2 给特定用户或特定电影推荐

df5 = model.recommendForUserSubset(spark.createDataFrame([(653,)],["userId"]),5)
df6 = model.recommendForItemSubset(spark.createDataFrame([(411,)],["movieId"]),5)
df5.show(truncate=False)
df6.show(truncate=False)

在这部分,我们为特定用户(用户ID为653)推荐5部电影,以及为特定电影(电影ID为411)推荐5个用户,并展示推荐结果。通过show(truncate=False)可以完整地查看推荐数据的内容。

七、提取推荐结果中的电影ID

最后,我们来看如何从推荐结果中提取电影ID信息。

df5.printSchema()

def getMovieIds(row):
    tuijianFilms = []
    arr = row.recommendations
    for ele in arr:
        print(ele.movieId)
        tuijianFilms.append(ele.movieId)
    print("推荐的电影有:", tuijianFilms)
df5.foreach(getMovieIds)

首先,printSchema显示了df5的结构,其中包含了推荐信息。然后我们定义了getMovieIds函数,通过遍历每行数据中的推荐列表,提取出电影ID并打印出来。通过df5.foreach(getMovieIds)将这个函数应用到df5的每一行数据上,从而实现对推荐电影ID的提取和打印。

通过以上步骤,我们完成了一个简单的基于PySpark的电影推荐系统的构建和分析。这个系统可以根据用户的历史评分数据,利用ALS算法为用户推荐可能感兴趣的电影,同时也展示了PySpark在数据处理和机器学习模型训练方面的强大功能。在实际应用中,可以进一步优化模型参数、改进数据处理流程以及提升用户体验等,以构建更高效、准确的推荐系统。

希望这篇博客能够帮助读者理解如何使用PySpark实现电影推荐系统,并且对其中的代码逻辑有更深入的了解。如果有任何问题,欢迎在评论区留言。
代码总结:

import os
from os import truncate

from pyspark.ml.recommendation import ALS
from pyspark.sql import SparkSession

if __name__ == '__main__':
    os.environ['JAVA_HOME'] = 'C:/Program Files/Java/jdk1.8.0_241'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
    os.environ['HADOOP_USER_NAME'] = 'root'
    os.environ['file.encoding'] = 'UTF-8'
    # 准备环境
    spark = SparkSession.builder.appName("电影推荐案例")\
        .master("local[*]").config("spark.sql.shuffle.partitions","4").getOrCreate()
    #读取数据,然后切割数据
    df1 = spark.read.text("../../../data/input/u.data")
    df1.printSchema()
    print(df1.take(10))
    # 根据\t 切割文件中的数据
    def split_data(line):
        arr =line.split("\t")
        return (int(arr[0]),int(arr[1]),int(arr[2]))
    df2 = df1.rdd.map(lambda row:split_data(row.value)).toDF(["userId", "movieId", "score"])
    print(df2.take(1))

    # 将我们的数据分为两部分,80% 用于训练,20% 用于测试
    train_data, test_data = df2.randomSplit([0.8, 0.2])
    """
      rank 可以理解为:可以理解为Cm*n = Am*k X Bk*n 里面的k的值
      maxIter:最大迭代次数
      alpha : 步长
    """
    als = ALS(userCol="userId",
              itemCol="movieId",
              ratingCol="score",
              rank=10,
              maxIter=10,
              alpha=1.0)

    # 使用训练集训练模型
    model = als.fit(train_data)

    # 将训练好的模型进行数据推荐
    # df3 = model.recommendForAllUsers(5)  # 给所有用户推荐5部电影
    # df4 = model.recommendForAllItems(5)  # 给所有电影推荐5个用户
    # df3.show(truncate=False)
    # df4.show(truncate=False)
    # 给某个用户推荐电影
    df5 = model.recommendForUserSubset(spark.createDataFrame([(653,)],["userId"]),5)
    df6 = model.recommendForItemSubset(spark.createDataFrame([(411,)],["movieId"]),5)

    # 给某个电影推荐用户
    df5.show(truncate=False)
    df6.show(truncate=False)
    # 如何把df5中的数据提取为  字符串
    df5.printSchema()


    def getMovieIds(row):
        tuijianFilms = []
        arr = row.recommendations
        for ele in arr:
            print(ele.movieId)
            tuijianFilms.append(ele.movieId)
        print("推荐的电影有:",tuijianFilms)
    df5.foreach(getMovieIds)

执行代码后,如果报如下错误:

ModuleNotFoundError: No module named 'numpy'

说明python中缺少numpy模块,需要下载:

pip install numpy

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟深度学习pytorch:批归一化全连接网络完成手写字体识别

本文重点 前面我们学习了普通的全连接神经网络,后面我们学习了带有激活层的全连接神经网络,本文我们继续进一步升级,我们学习带有批归一化的全连接神经网络,批归一化可以加快神经网络的训练速度,减少过拟合,具体它的原理,大家可以看我们的《每天五分钟深度学习》专栏,…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 6.自定义注解 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据&#xff…

什么是SMARC?模块电脑(核心板)规范标准简介三

1. 概念 SMARC(Smart Mobility ARChitecture,智能移动架构)是一种通用的小型计算机模块定义,基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台,旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板…

Filebeat升级秘籍:解锁日志收集新境界

文章目录 一、什么是filebeat二、Filebeat的工作原理2.1 filebeat的构成2.1.1 Prospector 组件2.1.2 Harvester 组件 2.2 filebeat如何保存文件的状态2.3 filebeat何如保证至少一次数据消费 三、Filebeat配置文件四、filebeat对比fluented五、Filebeat的部署安装5.1裸金属安装5…

C++小白实习日记——Day 4 将本地项目上传到gitee

生活就像一坨狗屎 我跑的代码老板说耗时太长了,不知道要怎么做才能耗时小一点 老板把我加到企业gitee里了,让我将代码上传到个人仓库: 新建一个文件夹当做库文件,点git bash here——> git init——>git config --global…

qiankun主应用(vue2+element-ui)子应用(vue3+element-plus)不同版本element框架css样式相互影响的问题

背景:qiankun微前端架构实现多应用集成 主应用框架:vue2 & element-ui 子应用框架:vue3 & element-plus >> 问题现象和分析 登录页面是主应用的,在登录之后才能打开子应用的菜单页面,即加载子应用。 首…

云渲染,解决houdini特效缓存太大上传太慢的问题

对于从事 Houdini 创作的艺术家和设计师们来说,使用云渲染的朋友,缓存太大导致云渲染上传慢一直是一个令人头疼的问题。然而,现在有了成都渲染 101 云渲染,这个难题迎刃而解。Houdini 以其强大的功能能够创建极为复杂和逼真的特效…

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局,使用 HTML 和 CSS 技术定义页面的结构、样式和布局,同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

学习QT第二天

QT6示例运行 运行一个Widgets程序运行一个QT Quick示例 工作太忙了,难得抽空学点东西。-_-||| 博客中有错误的地方,请各位道友及时指正,感谢! 运行一个Widgets程序 在QT Creator的欢迎界面中,点击左侧的示例&#xf…

删除课表中课程

文章目录 概要整体架构流程技术细节小结 概要 业务分析 删除课表中的课程有两种场景: 用户直接删除已失效的课程 用户退款后触发课表自动删除 技术细节 退款通知 其中用户退款与用户报名课程类似,都是基于MQ通知的方式。具体代码是在tj-trade模块的…

MySQL深度剖析-索引原理由浅入深

什么是索引? 官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

MATLAB常见数学运算函数

MATLAB中含有许多有用的函数,可以随时调用。 a b s abs abs函数 a b s abs abs函数在MATLAB中可以求绝对值,也可以求复数的模长:c e i l ceil ceil函数 向正无穷四舍五入(如果有小数,就向正方向进一)f l o o r floor floor函数 向负无穷四舍五入(如果有小数,就向负方向…

如何使用本地大模型做数据分析

工具:interpreter --local 样本数据: 1、启动分析工具 2、显示数据文件内容 输入: 显示/Users/wxl/work/example_label.csv 输出:(每次输出的结果可能会不一样) 3、相关性分析 输入: 分析客户类型与成…

操作系统不挂科】<创建线程(7)>单选多选简答题(带答案与解析)

前言 大家好吖,欢迎来到 YY 滴操作系统不挂科 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的操作系统题目,供yy应对期中考试复习。大家可以参考 本章为选择题题库,试卷…

RAG(Retrieval-Augmented Generation)评测篇

一、为什么需要 对 RAG 进行评测? 在探索和优化 RAG(检索增强生成器)的过程中,如何有效评估其性能已经成为关键问题。 二、如何合成 RAG 测试集? 假设你已经成功构建了一个RAG 系统,并且现在想要评估它的…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作: 使用资源管理器打开启动文件夹: 按下 Win R 键打开“运行”对话框。输入 shell:startup,然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹: 打开资源管理器并导航到以下路径: C:\Users\admin…

项目2:简易随机数生成器 --- 《跟着小王学Python·新手》

项目2:简易随机数生成器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握P…

数字资产与大健康领域的知识宝藏:高效知识库搭建策略

在数字化时代,大健康领域的企业积累了丰富的数字资产,这些资产如同一座待挖掘的金矿,蕴含着巨大的价值。高效搭建知识库,能够将这些数字资产转化为企业竞争力。 数字资产与大健康领域知识宝藏 数字资产在大健康领域包括患者数据…