《基于 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.rhkb.cn/news/473937.html

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

相关文章

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量?什么是数据类型?2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 🏅离线批处理:在复杂批处理任务中,云器Lakehouse相较Spark表现出13.31倍性能提升。 🏅即席查询:在交互式分析场景下,云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址:MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包:mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档:MySQL Enterprise Edition Installation Guide 二、安装…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时,有些时候,需要和第三方进行调式,但是第三方不在一起,需要进行远程调试&…

蜀道山CTF<最高的山最长的河>出题记录

出这道题的最开始感觉就是,因为现在逆向的形式好多,我最开始学习的时候,经常因为很多工具,或者手段完全不知道,就很懵逼,很多师傅都出了各种类型的,我就想着给以前的"自己"出一道正常exe,慢慢调的题,为了不那么简单,我就选择了C(究极混淆,可能比rust好点),让大家无聊…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要,对工作过程中遇到的问题进行记录,持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

AWTK VSCode 实时预览插件端口冲突的解决办法

AWTK XML UI 预览插件:在 vscode 中实时预览 AWTK XML UI 文件,在 Copilot 的帮助下,可以大幅提高界面的开发效率。 主要特色: 真实的 UI 效果。可以设置主题,方便查看在不同主题下界面的效果。可以设置语言&#xf…

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

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

如何对AWS进行节省

AWS 云服务器的费用确实可能会让人感到高昂,尤其是在资源使用不当或配置过多的情况下。不过,通过一些策略的合理应用和优化,完全可以降低云服务的使用成本,实现高效节省。以下是九河云总结的几种主要的优化方法,帮助你…

Macmini中普通鼠标与TrackPad联动问题解决

入手了一款Macmini,然后接了一个普通鼠标,然后又买了一个TrackPad。 接下来,问题来了,这两个玩意之间是联动的,出现问题的地方在于鼠标滚轮对于页面内容滚动的方向上。 通常Windows系统中,鼠标滚轮向前&am…

基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

🎈系统亮点:协同过滤算法、二维码识别; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框…

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

目录 深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解 一、引言:为什么要使用Array.find() 二、Array.find()的使用与技巧 1、基础语法 2、返回值 3、使用技巧 三、Array.find()的优势与实际应用案例 1、利用返回引用…

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长,制药装备企业需要在提高运维效率的同时,降低人工及差旅成本。制药装备因其数据具有高度的保密性,要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…

HBase 开发:使用Java操作HBase

1、实战简介 HBase和Hadoop一样,都是用Java进行开发的,本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。 实验环境: hadoop-2.7 JDK8.0 HBase2.1.1 2、任务 1、第1关:创建表 package step1; import java.io.IOE…

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记:学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)

一、安装ROS2-Humble 1、参考:Ubuntu22.04安装ROS2-humble-CSDN博客 2、确保安装完成 source /opt/ros/humble/setup.bash 方法一:二进制安装 sudo apt install ros-humble-moveit* 方法二:安装源码编译 一、卸载二进制安装包 sudo a…

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人,通常是为了经济利益。他们进入安全网络以销毁,赎回,修改或窃取数据,或使网络无法用于授权用户。这个名字来源于这样一个事实:老式的黑白西部电影中的恶棍很容易被电影观众识别&…

ISCTF 2024 web

ISCTF 2024 web 小蓝鲨的冒险 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); $a "isctf2024"; $b $_GET["b"]; parse_str($b); echo "小蓝鲨开始闯关&#xff0c;你能帮助他拿到flag吗?<br>"; if ($a…

AIGC----生成对抗网络(GAN)如何推动AIGC的发展

AIGC: 生成对抗网络(GAN)如何推动AIGC的发展 前言 随着人工智能领域的迅猛发展&#xff0c;AI生成内容&#xff08;AIGC&#xff0c;AI Generated Content&#xff09;正成为创意产业和技术领域的重要组成部分。在AIGC的核心技术中&#xff0c;生成对抗网络&#xff08;GAN&am…