news 2026/2/28 17:56:59

AI大模型:python美食推荐系统 数据分析系统 可视化 Django框架 食品分析 菜谱分析 协同过滤推荐算法 毕业设计(源码+文档)✅

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI大模型:python美食推荐系统 数据分析系统 可视化 Django框架 食品分析 菜谱分析 协同过滤推荐算法 毕业设计(源码+文档)✅

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈:Python语言、 MySQL数据库 Django框架 Echarts可视化 、 协同过滤推荐算法 html

  1. 美食列表
    瀑布流卡片展示全部菜品,支持按菜系、口味、价格、评分多维度筛选与模糊搜索;图片懒加载、分页滚动,点击即进详情。

  2. 美食详情页
    轮播主图、用料列表、制作步骤、营养标签集中呈现;用户可收藏、打分、评论,并即时查看“相似菜品”入口。

  3. 美食推荐
    提供“猜你喜欢”与“口味邻居也在吃”双栏:前者基于物品协同过滤,后者基于用户协同过滤,无刷新加载推荐结果。

  4. 可视化分析①
    交互仪表板集成词云、折线、饼图三大组件,任意切换维度与时间段,图形联动,一键导出高清图片用于汇报。

  5. 词云图
    自动抽取菜名、食材、用户标签生成词云,高频词汇突出显示,鼠标悬停可查看关联菜品,洞察流行口味。

  6. 折线图
    动态展示价格、评分或销量随时间变化趋势,支持区域缩放、节点标注,帮助运营掌握市场波动。

  7. 饼图
    直观对比各菜系、辣度、人群偏好占比,支持钻取下一级分类,颜色主题可一键切换。

  8. 个人中心 & 注册登录 & 后台管理
    个人中心聚合收藏、足迹、评分记录与偏好标签,支持头像修改与第三方绑定;注册登录含滑块验证码、找回密码;后台提供菜品、用户、订单、评论全模块CRUD,支持批量导入、图片裁剪、敏感词过滤及操作日志审计,运营人员无需代码即可维护全站数据。

2、项目界面

(1)美食列表

(2)美食详情页

(3)美食推荐—基于用户、基于物品

(4)可视化分析1

(2)词云图分析

(3)折线图分析

(4)饼图分析

(5)个人中心

(6)美食分类

(7)注册登录

(8)后台数据管理

3、项目说明

  1. 美食列表
    瀑布流卡片展示全部菜品,支持按菜系、口味、价格、评分多维度筛选与模糊搜索;图片懒加载、分页滚动,点击即进详情。

  2. 美食详情页
    轮播主图、用料列表、制作步骤、营养标签集中呈现;用户可收藏、打分、评论,并即时查看“相似菜品”入口。

  3. 美食推荐
    提供“猜你喜欢”与“口味邻居也在吃”双栏:前者基于物品协同过滤,后者基于用户协同过滤,无刷新加载推荐结果。

  4. 可视化分析①
    交互仪表板集成词云、折线、饼图三大组件,任意切换维度与时间段,图形联动,一键导出高清图片用于汇报。

  5. 词云图
    自动抽取菜名、食材、用户标签生成词云,高频词汇突出显示,鼠标悬停可查看关联菜品,洞察流行口味。

  6. 折线图
    动态展示价格、评分或销量随时间变化趋势,支持区域缩放、节点标注,帮助运营掌握市场波动。

  7. 饼图
    直观对比各菜系、辣度、人群偏好占比,支持钻取下一级分类,颜色主题可一键切换。

  8. 个人中心 & 注册登录 & 后台管理
    个人中心聚合收藏、足迹、评分记录与偏好标签,支持头像修改与第三方绑定;注册登录含滑块验证码、找回密码;后台提供菜品、用户、订单、评论全模块CRUD,支持批量导入、图片裁剪、敏感词过滤及操作日志审计,运营人员无需代码即可维护全站数据。

摘要

随着大数据与人工智能时代的到来,传统行业都发生了翻天覆地的变化,餐饮行业也不例外,但是在转型的过程中也会面临诸多挑战。在不同的领域应用经典的方法也会面临很多挑战,为此,本文在将推荐系统应用到美食中的时候,融合美食领域的特点,并使用协同过滤推荐算法应用于现实美食中用来解决面临的实际问题,设计并实现了一个以 B/S 架构为基础的美食推荐系统。
本系统使用Python语言结合Django框架进行开发,运用协同过滤推荐算法,完成通过用户的行为向其推荐美食的目的。后端主要使用Django框架,前端页面的开发选择了Bootstrap框架和HTML。利用MySQL数据库存储美食信息。本系统的前端用户模块主要包括注册、登录、美食标签分类、美食推荐、美食列表、美食排序等、后台管理模块主要包括用户管理、美食美食管理、用户权限管理等。推荐算法方面同时含有基于用户的协同过滤以及基于物品的协同过滤推荐,该系统具有一定的应用价值。

关键词:美食推荐; 协同过滤算法; Python语言;Django框架;可视化;

4、核心代码

# -*-coding:utf-8-*-importos os.environ["DJANGO_SETTINGS_MODULE"]="recommend.settings"importdjango django.setup()fromitem.modelsimport*frommathimportsqrt,powimportoperatorfromdjango.db.modelsimportSubquery,Q,Count# from django.shortcuts import render,render_to_responseclassUserCf:# 获得初始化数据def__init__(self,all_user):self.all_user=all_user# 通过用户名获得列表,仅调试使用defgetItems(self,username1,username2):returnself.all_user[username1],self.all_user[username2]# 计算两个用户的皮尔逊相关系数defpearson(self,user1,user2):# 数据格式为:美食id,浏览此sum_xy=0.0# user1,user2 每项打分的成绩的累加n=0# 公共浏览次数sum_x=0.0# user1 的打分总和sum_y=0.0# user2 的打分总和sumX2=0.0# user1每项打分平方的累加sumY2=0.0# user2每项打分平方的累加formovie1,score1inuser1.items():ifmovie1inuser2.keys():# 计算公共的浏览次数n+=1sum_xy+=score1*user2[movie1]sum_x+=score1 sum_y+=user2[movie1]sumX2+=pow(score1,2)sumY2+=pow(user2[movie1],2)ifn==0:# print("p氏距离为0")return0molecule=sum_xy-(sum_x*sum_y)/n# 分子denominator=sqrt((sumX2-pow(sum_x,2)/n)*(sumY2-pow(sum_y,2)/n))# 分母ifdenominator==0:return0r=molecule/denominatorreturnr# 计算与当前用户的距离,获得最临近的用户defnearest_user(self,current_user,n=1):distances={}# 用户,相似度# 遍历整个数据集foruser,rate_setinself.all_user.items():# 非当前的用户ifuser!=current_user:distance=self.pearson(self.all_user[current_user],self.all_user[user])# 计算两个用户的相似度distances[user]=distance closest_distance=sorted(distances.items(),key=operator.itemgetter(1),reverse=True)# 最相似的N个用户print("closest user:",closest_distance[:n])returnclosest_distance[:n]# 给用户推荐美食defrecommend(self,username,n=3):recommend={}nearest_user=self.nearest_user(username,n)foruser,scoreindict(nearest_user).items():# 最相近的n个用户formovies,scoresinself.all_user[user].items():# 推荐的用户的美食列表ifmoviesnotinself.all_user[username].keys():# 当前username没有看过ifmoviesnotinrecommend.keys():# 添加到推荐列表中recommend[movies]=scores*score# 对推荐的结果按照美食# 浏览次数排序returnsorted(recommend.items(),key=operator.itemgetter(1),reverse=True)# 基于用户的推荐defrecommend_by_user_id(user_id):user_prefer=UserTagPrefer.objects.filter(user_id=user_id).order_by('-score').values_list('tag_id',flat=True)current_user=User.objects.get(id=user_id)# 如果当前用户没有打分 则看是否选择过标签,选过的话,就从标签中找# 没有的话,就按照浏览度推荐15个ifcurrent_user.rate_set.count()==0:iflen(user_prefer)!=0:movie_list=xiangmu.objects.filter(tags__in=user_prefer)[:15]else:movie_list=xiangmu.objects.order_by("-c9")[:15]returnmovie_list# 选取评分最多的10个用户users_rate=Rate.objects.values('user').annotate(mark_num=Count('user')).order_by('-mark_num')user_ids=[user_rate['user']foruser_rateinusers_rate]user_ids.append(user_id)users=User.objects.filter(id__in=user_ids)#users 为评分最多的10个用户all_user={}foruserinusers:rates=user.rate_set.all()#查出10名用户的数据rate={}# 用户有给美食打分 在rate和all_user中进行设置ifrates:foriinrates:rate.setdefault(str(i.movie.id),i.mark)#填充美食数据all_user.setdefault(user.username,rate)else:# 用户没有为美食打过分,设为0all_user.setdefault(user.username,{})user_cf=UserCf(all_user=all_user)recommend_list=[each[0]foreachinuser_cf.recommend(current_user.username,15)]movie_list=list(xiangmu.objects.filter(id__in=recommend_list).order_by("-c9")[:15])other_length=15-len(movie_list)ifother_length>0:fix_list=xiangmu.objects.filter(~Q(rate__user_id=user_id)).order_by('-collect')forfixinfix_list:iffixnotinmovie_list:movie_list.append(fix)iflen(movie_list)>=15:breakreturnmovie_list# 计算相似度defsimilarity(movie1_id,movie2_id):movie1_set=Rate.objects.filter(movie_id=movie1_id)# movie1的打分用户数movie1_sum=movie1_set.count()# movie_2的打分用户数movie2_sum=Rate.objects.filter(movie_id=movie2_id).count()# 两者的交集common=Rate.objects.filter(user_id__in=Subquery(movie1_set.values('user_id')),movie=movie2_id).values('user_id').count()# 没有人给当前美食打分ifmovie1_sum==0ormovie2_sum==0:return0similar_value=common/sqrt(movie1_sum*movie2_sum)#余弦计算相似度returnsimilar_value#基于物品defrecommend_by_item_id(user_id,k=15):# 前三的tag,用户评分前三的美食user_prefer=UserTagPrefer.objects.filter(user_id=user_id).order_by('-score').values_list('tag_id',flat=True)user_prefer=list(user_prefer)[:3]print('user_prefer',user_prefer)current_user=User.objects.get(id=user_id)# 如果当前用户没有打分 则看是否选择过标签,选过的话,就从标签中找# 没有的话,就按照浏览度推荐15个ifcurrent_user.rate_set.count()==0:iflen(user_prefer)!=0:movie_list=xiangmu.objects.filter(tags__in=user_prefer)[:15]else:movie_list=xiangmu.objects.order_by("-c9")[:15]print('from here')returnmovie_list# most_tags = Tags.objects.annotate(tags_sum=Count('name')).order_by('-tags_sum').filter(movie__rate__user_id=user_id).order_by('-tags_sum')# 选用户最喜欢的标签中的美食,用户没看过的30部,对这30部美食,计算距离最近un_watched=xiangmu.objects.filter(~Q(rate__user_id=user_id),tags__in=user_prefer).order_by('?')[:30]# 看过的美食watched=Rate.objects.filter(user_id=user_id).values_list('movie_id','mark')distances=[]names=[]# 在未看过的美食中找到forun_watched_movieinun_watched:forwatched_movieinwatched:ifun_watched_movienotinnames:names.append(un_watched_movie)distances.append((similarity(un_watched_movie.id,watched_movie[0])*watched_movie[1],un_watched_movie))#加入相似的美食distances.sort(key=lambdax:x[0],reverse=True)print('this is distances',distances[:15])recommend_list=[]formark,movieindistances:iflen(recommend_list)>=k:breakifmovienotinrecommend_list:recommend_list.append(movie)# print('this is recommend list', recommend_list)# 如果得不到有效数量的推荐 按照未看过的美食中的热度进行填充print('recommend list',recommend_list)returnrecommend_listif__name__=='__main__':# similarity(2003, 2008)print(recommend_by_item_id(1799))

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 13:00:07

Vue 中如何修改地址栏参数并重新加载?

Vue 中如何修改地址栏参数并重新加载? 文章目录Vue 中如何修改地址栏参数并重新加载?1. 使用 Vue Router 的 replace 方法2. 使用 Vue Router 的 push 方法(添加历史记录)3. 使用 Composition API(Vue 3)4.…

作者头像 李华
网站建设 2026/2/27 12:36:29

物流信息开题报告

目录 物流信息开题报告概述研究背景与意义国内外研究现状研究内容与方法技术路线与创新点进度安排与参考文献注意事项 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 物流信息开题报告概述 开题报告是物…

作者头像 李华
网站建设 2026/2/28 14:02:47

物流收件管理系统分析与设计 开题报告

目录 物流收件管理系统开题报告介绍系统开发背景系统核心功能模块系统技术架构系统设计目标预期研究成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 物流收件管理系统开题报告介绍 物流收件管理系统…

作者头像 李华
网站建设 2026/2/28 8:07:55

System Operations Management 2

11. Configuration 配置Explanation: The process of setting up software, hardware, or a system by defining parameters, options, and settings to ensure it functions correctly.通过定义参数、选项和设置来配置软件、硬件或系统,以确保其正常运行。Example …

作者头像 李华
网站建设 2026/2/27 7:52:21

Git新手必学的3个实战技巧

一、技巧一:代码冲突解决(五步法) 1. 发现冲突 执行 git merge 或 git pull 时,Git 提示冲突后,用 git status 查看冲突文件(标记为 both modified): bash git status # 输出示…

作者头像 李华