基于Spark的智能餐饮推荐系统报告(只含部分代码)

2024-06-17 03:20

本文主要是介绍基于Spark的智能餐饮推荐系统报告(只含部分代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 基本信息

1.1 系统名称

基于Spark的智能餐饮推荐系统

1.2 开发运行环境

Linux: Ubuntu 14.04

MySQL: 5.7.16

Hadoop: 2.7.1

Hive: 1.2.1

Sqoop: 1.4.6

Spark: 2.1.0

Eclipse: 3.8 (注意:Eclipse 3.8是一个较旧的版本,考虑使用更新版本)

ECharts: 3.4.0

1.3 使用的核心技术

Spark大数据分析框架

MLlib机器学习库

MySQL数据库管理系统

Hadoop生态系统(HDFS, YARN等)

Hive数据仓库

Sqoop数据导入导出工具

ECharts数据可视化库

  1. 系统功能设计

本系统旨在通过大数据分析,为用户提供个性化的餐饮推荐。通过分析用户的饮食偏好、历史记录等信息,结合餐饮商户的菜品、评价等数据,为用户提供精准、及时的推荐服务

2.1系统总体功能

本系统旨在通过大数据分析,为用户提供个性化的餐饮推荐。通过分析用户的饮食偏好、历史记录等信息,结合餐饮商户的菜品、评价等数据,为用户提供精准、及时的推荐服务。

2.2系统模块详细设计

2.2.1 数据预处理功能模块

对原始数据进行清洗、转换、整合等预处理操作

为后续的数据分析和推荐算法提供规范、统一的数据格式

2.2.2 推荐算法功能模块

推荐算法功能是基于python机器学习库实现的,旨在通过分析用户的历史行为和偏好,以及餐饮商户的菜品、评价等信息,为用户提供个性化的餐饮推荐。该功能采用了协同过滤(Collaborative Filtering)算法,包括用户-用户(User-User)协同过滤和物品-物品(Item-Item)协同过滤,以确保推荐的准确性和多样性。

2.2.3 ECharts功能模块

ECharts 是一个使用 JavaScript 实现的开源可视化库,可以生成各种类型的图表,包括折线图、柱状图、散点图、饼图等。在智能餐饮推荐系统中,ECharts 可以用于展示用户行为数据、菜品销售数据、用户评价等,帮助餐饮管理者直观地了解餐厅的运营情况和用户偏好。

2.3数据库设计(使用E-R图或者三线表)

用户表:存储用户基本信息(如ID、姓名等)

菜单表:存储菜单(编号、菜品名)

  1. 系统实现

3. 数据预处理功能实现

3.1.1 功能描述

数据预处理功能在智能餐饮推荐系统中扮演着至关重要的角色。它负责清洗、转换、整合从各种数据源中收集到的原始数据,以确保数据的质量和一致性,为后续的数据分析和推荐算法提供规范、统一的数据格式。

数据清洗:去除重复、缺失或异常的数据记录,处理格式不一致的数据字段。

数据转换:将数据从原始格式转换为适合分析的格式,例如将字符串类型的日期转换为日期格式,将文本型的评价转换为数值型评分等。

数据整合:将来自不同数据源的数据整合到一起,形成完整的数据集,以便进行统一的分析和处理。

3.1.2 核心代码

第1步:读取数据val path = "/home/hadoop/Meal.json"val df = spark.read.json(path)df.printSchema()df.createOrReplaceTempView("data")spark.sql("select userid, mealid, rating, review from data").show(5)第2步:数据探索scalaspark.sql("select count(*) as records from data").show()spark.sql("select count(distinct userid) as users from data").show()第3步:按日期分组统计数据分布scalaval dataWithDate = spark.sql("select *, (From_Unixtime(reviewtime, 'yyyy-MM-dd')) as reviewdate from data")dataWithDate.createOrReplaceTempView("dataWithDate")第4步:查询最新评分记录scalaval lastRating = spark.sql("select userid, mealid, MAX(reviewtime) as lastdate from data group by userid, mealid")lastRating.createOrReplaceTempView("lastRatingPair")val lastRatingRecord = spark.sql("""select a.userid, a.mealid, a.rating, a.reviewtimefrom data ajoin lastRatingPair bon a.userid = b.userid and a.mealid = b.mealid and a.reviewtime = b.lastdate""")lastRatingRecord.createOrReplaceTempView("lastRatingRecord")第5步:数据去重和排序// 将DataFrame转换为RDDval ratingrdd = lastRatingRecord.rdd.map(row =>(row.getAs[String]("userid"), row.getAs[String]("mealid"), row.getAs[Double]("rating"), row.getAs[Long]("reviewtime")))// 对mealid进行编码val mealzipcode = ratingrdd.map(_._2).distinct.sortBy(x => x).zipWithIndex.map(a => (a._1, a._2.toInt))// 对userid进行编码val userzipcode = ratingrdd.map(_._1).distinct.sortBy(x => x).zipWithIndex.map(a => (a._1, a._2.toInt))// 将编码结果收集到Map中val userzipcodemap = userzipcode.collect().toMapval mealzipcodemap = mealzipcode.collect().toMap// 将原始数据中的userid和mealid替换为编码后的值,并按时间排序val ratingcodelist = ratingrdd.map {case (userid, mealid, rating, reviewtime) =>(userzipcodemap(userid), mealzipcodemap(mealid), rating, reviewtime)}.sortBy(_._4)第6步:数据集分割val totalnum = ratingcodelist.count()val splitpoint1 = (totalnum * 0.8).toIntval splitpoint2 = (totalnum * 0.9).toInt

3.1.3 运行截图

第1步:读取数据

第2步:数据探索

第3步:按日期分组统计数据分布

第4步:查询最新评分记录

第5步:数据去重和排序

第6步:数据集分割

3.2 推荐算法功能实现

3.2.1 功能描述

推荐算法功能是基于python机器学习库实现的,旨在通过分析用户的历史行为和偏好,以及餐饮商户的菜品、评价等信息,为用户提供个性化的餐饮推荐。该功能采用了协同过滤(Collaborative Filtering)算法,包括用户-用户(User-User)协同过滤和物品-物品(Item-Item)协同过滤,以确保推荐的准确性和多样性。

3.2.2 核心代码

import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics.pairwise import linear_kernelimport chardetdef detect_encoding(file_path):with open(file_path, 'rb') as f:result = chardet.detect(f.read())return result['encoding']user_item_file = 'userzipcode.csv'menu_file = 'meal_list.csv'user_item_encoding = detect_encoding(user_item_file)menu_encoding = detect_encoding(menu_file)user_item_data = pd.read_csv(user_item_file, encoding=user_item_encoding)menu_data = pd.read_csv(menu_file, encoding=menu_encoding)# 后续流程...# 3.合并用户评价数据和菜品名称数据data = pd.merge(user_item_data, menu_data, left_on='MealID', right_on='mealID')# 4.加载训练数据train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)# 5.加载推荐模型tfidf = TfidfVectorizer(stop_words='english')train_tfidf_matrix = tfidf.fit_transform(train_data['Review'])# 6.计算余弦相似度cosine_sim = linear_kernel(train_tfidf_matrix, train_tfidf_matrix)# 7.为用户推荐菜品def get_recommendations(user_id, num_recommendations):# 获取用户的所有评价记录user_reviews = train_data[train_data['UserID'] == user_id]if user_reviews.empty:return "User not found or has no reviews."# 获取用户最后一次评价的菜品索引user_last_review_index = user_reviews.index[-1]# 计算与用户最后一次评价的菜品的相似度sim_scores = list(enumerate(cosine_sim[user_last_review_index]))sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)# 获取前num_recommendations个最相似的菜品的索引sim_scores = sim_scores[1:num_recommendations+1]meal_indices = [i[0] for i in sim_scores]# 返回最相似的菜品名称return train_data.iloc[meal_indices]['meal_name']# 示例:user_id = 'A2WOH395IHGS0T'  # 请根据实际数据中的UserID进行更改num_recommendations = 5recommended_items = get_recommendations(user_id, num_recommendations)print("Recommended Items for User", user_id)for item in recommended_items:print(item)

3.2.3 运行截图

3.3 ECharts功能实现

3.3.1 功能描述

ECharts 是一个使用 JavaScript 实现的开源可视化库,可以生成各种类型的图表,包括折线图、柱状图、散点图、饼图等。在智能餐饮推荐系统中,ECharts 可以用于展示用户行为数据、菜品销售数据、用户评价等,帮助餐饮管理者直观地了解餐厅的运营情况和用户偏好。

3.3.2 核心代码

Jsp代码:

<%@ page language="java" import="dbtaobao.connDb,java.util.*" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%ArrayList<String[]> list = connDb.index();%>    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>ECharts 可视化分析餐饮推荐</title><link href="./css/style.css" type='text/css' rel="stylesheet"/><script src="./js/echarts.min.js"></script></head><body><div class='header'><p>ECharts 可视化分析餐饮推荐</p></div><div class="content"><div class="nav"><ul><li class="current"><a href="#">不同星级菜品消费对比</a></li><li><a href="./index1.jsp">菜品消费是否推荐对比</a></li><li><a href="./index2.jsp">部分菜品消费数量对比</a></li><li><a href="./index3.jsp">销售前五的菜品</a></li></ul></div><div class="container"><div class="title">不同星级菜品消费对比</div><div class="show"><div class='chart-type'>饼图</div><div id="main"></div></div></div></div><script>//基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据option = {backgroundColor: '#2c343c',title: {text: '不同星级菜品消费对比比例图',left: 'center',top: 20,textStyle: {color: '#ccc'}},tooltip : {trigger: 'item',formatter: "{a} <br/>{b} : {c} ({d}%)"},visualMap: {show: false,min: 80,max: 600,inRange: {colorLightness: [0, 1]}},series : [{name:'消费行为',type:'pie',radius : '55%',center: ['50%', '50%'],data:[{value:<%=list.get(0)[1]%>, name:'2'},{value:<%=list.get(1)[1]%>, name:'3'},{value:<%=list.get(2)[1]%>, name:'4'},{value:<%=list.get(3)[1]%>, name:'5'},].sort(function (a, b) { return a.value - b.value}),roseType: 'angle',label: {normal: {textStyle: {color: 'rgba(255, 255, 255, 0.3)'}}},labelLine: {normal: {lineStyle: {color: 'rgba(255, 255, 255, 0.3)'},smooth: 0.2,length: 10,length2: 20}},itemStyle: {normal: {color: '#c23531',shadowBlur: 200,shadowColor: 'rgba(0, 0, 0, 0.5)'}},animationType: 'scale',animationEasing: 'elasticOut',animationDelay: function (idx) {return Math.random() * 200;}}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);</script></body></html>

Java代码:

package dbtaobao;import java.sql.*;import java.util.ArrayList;public class connDb {private static Connection con = null;private static Statement stmt = null;private static ResultSet rs = null;//连接数据库方法public static void startConn(){try{Class.forName("com.mysql.jdbc.Driver");//连接数据库中间件try{con = DriverManager.getConnection("jdbc:MySQL://localhost:3306/dbtaobao","root","123456");}catch(SQLException e){e.printStackTrace();}}catch(ClassNotFoundException e){e.printStackTrace();}}//关闭连接数据库方法public static void endConn() throws SQLException{if(con != null){con.close();con = null;}if(rs != null){rs.close();rs = null;}if(stmt != null){stmt.close();stmt = null;}}//数据库双11 所有买家消费行为比例public static ArrayList index() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT `action`, COUNT(*) AS num\n"+ "FROM `user_log`\n"+ "GROUP BY `action`\n"+ "ORDER BY num DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("action"),rs.getString("num")};list.add(temp);}endConn();return list;}//男女买家交易对比public static ArrayList index_1() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT gender, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY gender\n"+ "ORDER BY gender DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("gender"),rs.getString("num")};list.add(temp);}endConn();return list;}//男女买家各个年龄段交易对比public static ArrayList index_2() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT gender, age_range, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY gender, age_range\n"+ "ORDER BY gender DESC, age_range DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("gender"),rs.getString("age_range"),rs.getString("num")};list.add(temp);}endConn();return list;}//获取销量前五的商品类别public static ArrayList index_3() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT cat_id, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY cat_id\n"+ "ORDER BY COUNT(*) DESC\n"+ "LIMIT 5;\n"+ "");while(rs.next()){String[] temp={rs.getString("cat_id"),rs.getString("num")};list.add(temp);}endConn();return list;}//各个省份的总成交量对比public static ArrayList index_4() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("select province,count(*) num from user_log group by province order by count(*) DESC");while(rs.next()){String[] temp={rs.getString("province"),rs.getString("num")};list.add(temp);}endConn();return list;}}

3.1.3 运行截图

4.总结体会

通过本系统的设计与实现,我深刻体会到了大数据和机器学习在智能推荐领域的应用价值。在实际开发过程中,我遇到了许多挑战,如数据清洗的复杂性、推荐算法的优化等。但通过不断的学习和实践,我逐渐掌握了相关技术,并成功实现了系统的各项功能。未来,我将继续深入研究大数据和机器学习领域,探索更多可能的应用场景。

5.附录

这篇关于基于Spark的智能餐饮推荐系统报告(只含部分代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068353

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L