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

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

基于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.recommendationsfor 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 truncatefrom pyspark.ml.recommendation import ALS
from pyspark.sql import SparkSessionif __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.recommendationsfor 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.mzph.cn/diannao/61496.shtml

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

相关文章

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序,我这里…

【华为】配置VXLAN构建虚拟网络实现相同网段互通(静态方式)

微思网络 厦门微思网络 组网需求 企业已经建成比较成熟的园区网络,但是没有专用的数据中心网络,所有的服务器分布在不同的部门,并且不具备集中放置的条件。现在用户希望在已有园区网络上构建一个虚拟网络,需求如下: 将…

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中,特别是在训练深度神经网络时常见的一个问题,其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加,梯度在反向传播过程中会逐层累积变…

AI工具百宝箱|任意选择与Chatgpt、gemini、Claude等主流模型聊天的Anychat,等你来体验!

文章推荐 AI工具百宝箱|使用Deep Live Cam,上传一张照片就可以实现实时视频换脸...简直太逆天! Anychat 这是一款可以与任何模型聊天 (chatgpt、gemini、perplexity、claude、metal llama、grok 等)的应用。 在页面…

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度:…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

GitLab|数据迁移

注意:新服务器GitLab版本需和旧版本一致 在旧服务器执行命令进行数据备份 gitlab-rake gitlab:backup:create 备份数据存储在 /var/opt/gitlab/backups/ 将备份数据传输到新服务器的/var/opt/gitlab/backups/下,并修改文件权限(下载前和上传…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时,获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法,您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

HDMI数据传输三种使用场景

视频和音频的传输 在HDMI传输音频中有3种方式进行传输,第一种将音频和视频信号被嵌入到同一数据流中,通过一个TMDS(Transition Minimized Differential Signaling)通道传输。第二种ARC。第三张种eARC。这三种音频的传输在HDMI线中…

解决IDEA中Maven管理界面不是层级结构的问题

文章目录 0. 前言1. 点击Maven管理界面右上角的三个点2. 勾选将模块分组3. 分组后的层级结构 更多 IDEA 的使用技巧可查看 IDEA 专栏中的文章:IDEA 0. 前言 在 IDEA 中,如果项目中有很多子模块,每个子模块中又有一个或多个子模块时&#xf…

GPT1.0 和 GPT2.0 的联系与区别

随着自然语言处理技术的飞速发展,OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表,GPT-1 和 GPT-2 虽然在架构上有着继承关系,但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

css使用弹性盒,让每个子元素平均等分父元素的4/1大小

css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…

佛山三水戴尔R740服务器黄灯故障处理

1:佛山三水某某大型商场用户反馈一台DELL PowerEdge R740服务器近期出现了黄灯警告故障,需要冠峰工程师协助检查故障灯原因。 2:工程师协助该用户通过笔记本网线直连到服务器尾部的IDRAC管理端口,默认ip 192.168.0.120 密码一般在…

[ 应急响应进阶篇-1 ] Windows 创建后门并进行应急处置(后门账户\计划任务后门\服务后门\启动项后门\粘贴键后门)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)

解题思路: 方法一:递归法(方法二更好理解,个人更习惯方法二) 前中后序均可,实际上没有中的处理 中左右,左中右,左右中,实际上都是左在前,所以遇到的第一个…

基于web的教务系统的实现(springboot框架 mysql jpa freemarker)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vue学习11.21

vue特点: 采用组件化开发,提高代码复用率和维护 声明式编码,不需要直接操作DOM元素 使用diff算法,把虚拟DOM变成真实DOM, 如果两个容器都用vue的实例,只选最上面的容器。 一个容器使用两个vue实例也不行…

【数据分享】中国汽车工业年鉴(1986-2023)

本年鉴是由工业和信息化部指导,中国汽车技术研究中心有限公司与中国汽车工业协会联合主办。《年鉴》是全面、客观记载中国汽车工业发展与改革历程的重要文献,内容涵盖汽车产业政策、标准、企业、市场以及全国各省市汽车工业发展情况,并调查汇…

Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…