当前位置: 首页 > news >正文

计算机毕业设计:基于Python与协同过滤的美食推荐系统 Django框架 可视化 协同过滤推荐算法 菜谱 食品 机器学习(建议收藏)✅

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

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

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

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

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

1、项目介绍

技术栈
Python 语言、Django 框架、MySQL 数据库、Echarts 可视化库、协同过滤推荐算法(基于用户与基于物品)、HTML、Bootstrap 前端框架

功能模块

  • 美食列表模块
  • 美食详情页模块
  • 美食推荐模块
  • 可视化分析模块
  • 词云图分析模块
  • 折线图分析模块
  • 饼图分析模块
  • 个人中心模块
  • 用户认证模块
  • 后台管理模块

项目介绍
本系统是基于 Python 与 Django 开发的美食推荐与可视化平台,以 B/S 架构为基础,融合协同过滤推荐算法解决美食领域的个性化推荐问题。系统前端采用 Bootstrap 与 HTML 构建响应式界面,后端通过 Django 框架处理业务逻辑,数据存储于 MySQL 数据库。用户可通过美食列表按菜系、口味、价格等多维度筛选菜品,进入详情页查看用料与步骤并进行收藏、评分、评论。推荐模块同时提供基于用户与基于物品的协同过滤算法,生成“猜你喜欢”与“口味邻居也在吃”双栏推荐结果。可视化部分集成词云、折线图、饼图等组件,支持多维度数据展示与图表联动。个人中心聚合收藏与评分记录,后台管理支持菜品、用户、评论的全模块维护。

2、项目界面

(1)美食列表
该页面是美食推荐系统的首页模块,可按热度排序展示菜谱,支持搜索功能,同时设有标签分类、数据可视化、后台管理等导航入口,还提供最近更新菜谱展示及基于用户的个性化美食推荐功能。

(2)美食详情页
该页面是美食推荐系统的菜谱详情模块,展示菜谱的基础信息、配料及互动数据,支持收藏操作,同时提供基于物品和用户的个性化推荐功能,还具备搜索、标签分类、数据可视化及后台管理等系统功能入口。

(3)美食推荐—基于用户、基于物品
该页面是美食推荐系统的菜谱详情模块,展示菜谱配料与标签信息,支持用户提交评论,提供基于物品和用户的个性化推荐功能,同时具备最近更新菜谱展示及系统导航等功能入口。

(4)可视化分析1
该页面是美食推荐系统的数据可视化模块,通过双轴图表同步展示不同菜系的菜谱数量与美食评分分布情况,同时系统还提供首页、标签分类、后台管理及搜索等功能入口,方便用户进行多维度数据查看与系统操作。

(2)词云图分析
该页面是美食推荐系统的数据可视化模块,以词云图形式展示美食名称分布,同时提供分类数量与美食评分、上架数量曲线、分类占比等多维度可视化视图切换功能,还集成了系统导航与搜索等功能入口。

(3)折线图分析
该页面是美食推荐系统的数据可视化模块,通过折线图表展示美食上架数量随时间的变化趋势,同时支持多维度可视化视图切换,还集成了首页、标签分类、后台管理及搜索等系统功能入口。

(4)饼图分析
该页面是美食推荐系统的数据可视化模块,通过环形饼图展示各菜系菜谱的分类占比情况,支持多维度可视化视图切换,同时集成了首页、标签分类、后台管理及搜索等系统功能入口。

(5)个人中心
该页面是美食推荐系统的个人中心模块,展示用户基础信息,支持查看收藏、评论、评分记录,可修改账号信息,同时集成最近更新菜谱展示、个性化推荐及系统导航与搜索等功能入口。

(6)美食分类
该页面是美食推荐系统的标签分类模块,以列表形式展示各类菜系标签,方便用户按菜系筛选菜谱,同时集成最近更新菜谱展示、个性化推荐及系统导航与搜索等功能入口。

(7)注册登录
该页面是美食推荐系统的用户登录模块,提供账号密码输入与登录功能,同时支持新用户注册跳转,是系统权限管控与用户身份验证的核心入口。

(8)后台数据管理
这是推荐系统后台管理的美食管理页面,可进行美食数据的浏览、增加、删除操作,同时展示美食相关信息及图片链接,左侧还包含首页、偏好、标签、用户等其他管理功能模块入口。

3、项目说明

一、技术栈简要说明
系统后端采用 Python 语言与 Django 框架构建,数据库选用 MySQL 进行数据存储。前端使用 Bootstrap 与 HTML 构建响应式界面。推荐模块采用基于用户与基于物品的协同过滤算法,可视化部分通过 Echarts 图表库实现词云、折线图、饼图等多种图形渲染。

二、功能模块详细介绍
· 美食列表模块
作为系统首页,采用瀑布流卡片形式展示全部菜品,支持按菜系、口味、价格、评分等多维度筛选与模糊搜索。集成图片懒加载与分页滚动功能,提供按热度排序、最近更新菜谱展示以及基于用户的个性化推荐入口,用户点击卡片即可进入详情页。

· 美食详情页模块
集中展示菜谱的轮播主图、用料列表、制作步骤、营养标签等信息,同时呈现菜谱的基础数据与互动统计。用户可在该页面执行收藏、打分、评论等操作,并即时查看基于物品与基于用户协同过滤算法生成的“相似菜品”推荐结果。

· 美食推荐模块
提供“猜你喜欢”与“口味邻居也在吃”双栏推荐区域,前者基于物品协同过滤算法,后者基于用户协同过滤算法。推荐结果采用无刷新加载方式,根据用户历史行为动态生成个性化菜品推荐列表。

· 可视化分析模块
集成交互式仪表板,支持词云、折线图、饼图三大组件的任意切换与多维度数据筛选。各图表间可实现图形联动,并支持一键导出高清图片用于汇报分析。

· 词云图分析模块
自动抽取菜名、食材、用户标签等文本信息生成词云图,高频词汇突出显示,鼠标悬停可查看关联菜品,帮助用户洞察当前流行口味与热门食材。

· 折线图分析模块
动态展示菜品价格、评分或销量随时间变化的趋势曲线,支持区域缩放与节点标注功能,便于运营人员掌握市场波动规律与菜品表现变化。

· 饼图分析模块
以环形饼图直观对比各菜系、辣度等级、人群偏好等分类维度的占比情况,支持钻取下一级分类查看细分数据,颜色主题可一键切换适应不同展示场景。

· 个人中心模块
聚合用户的收藏记录、浏览足迹、评分记录与偏好标签,支持头像修改与账号信息编辑,同时集成最近更新菜谱展示与个性化推荐入口,便于用户集中管理个人互动数据。

· 用户认证模块
提供用户注册与登录功能,包含滑块验证码验证、密码找回等安全机制,保障系统访问安全,是用户使用收藏、评分、评论等个性化功能的前提。

· 后台管理模块
为管理员提供菜品、用户、订单、评论等全模块的增删改查操作,支持批量导入数据、图片裁剪、敏感词过滤及操作日志审计功能,运营人员无需编写代码即可维护全站数据。

三、项目总结
本系统是基于 Python 与 Django 开发的美食推荐与可视化平台,以 B/S 架构为基础,融合协同过滤推荐算法解决美食领域的个性化推荐问题。系统前端采用 Bootstrap 与 HTML 构建响应式界面,后端通过 Django 框架处理业务逻辑,数据存储于 MySQL 数据库。用户可通过美食列表按多维度筛选菜品,进入详情页查看用料与步骤并进行收藏、评分、评论。推荐模块同时提供基于用户与基于物品的协同过滤算法,生成“猜你喜欢”与“口味邻居也在吃”双栏推荐结果。可视化部分集成词云、折线图、饼图等组件,支持多维度数据展示与图表联动。个人中心聚合收藏与评分记录,后台管理支持菜品、用户、评论的全模块维护,为美食爱好者与运营人员提供完整的菜品浏览、互动推荐与数据洞察服务。

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、源码获取方式

http://www.jsqmd.com/news/532066/

相关文章:

  • Qwen3多风格字幕展示:科技感、简约风、手写体效果对比
  • N10 ARM中断
  • AI也开始“说谎”了?3·15曝光的“投毒”黑产,正在操控你的每一次提问
  • 信创生态下的国产存储技术路径:从CPU到数据库的全链路验证
  • 【MCP连接器接入黄金标准】:基于127个生产环境案例总结的7类典型失败场景与对应诊断命令集
  • Python内存泄漏检测失效?:揭秘CPython 3.11+新增的__tracing__机制与自定义GC钩子实战(含GitHub Star 2.4k工具链深度集成)
  • 哔哩下载姬进阶指南:从高效下载到专业处理的全方位解决方案
  • 3种突破限制的MTK设备控制方案:MTKClient全场景应用指南
  • 杰理之短距离滑动触摸逻辑如下【篇】
  • 像素幻梦创意工坊案例分享:为开源RPG引擎生成全系像素道具图标集
  • 中国典型城市建筑物实例数据集:高精度遥感影像标注与应用指南
  • Android APK安装失败全攻略:从错误代码到机型适配
  • LangChain实战:用SQLite为AI对话系统添加持久化记忆(附完整代码)
  • Qwen-Image-2512-Pixel-Art-LoRA 惊艳案例:生成社交媒体像素风海报与头像
  • 基于Phi-3-mini-4k-instruct的MySQL数据库智能查询优化
  • cv_unet图像抠图WebUI效果展示:高清人像抠图作品集,边缘自然流畅
  • Abaqus自动化仿真进阶:如何用Python+批处理打造“无人值守”仿真工作流
  • 避开这些坑!STM32遥控器PCB布局布线实战经验分享(附双摇杆/霍尔摇杆设计对比)
  • iOS 敏感密钥泄漏怎么防?我踩了三个坑才找到正确姿势
  • 达川区口碑好的洗脚哪家好
  • 电源毕业设计实战:从拓扑选型到PCB布局的完整工程实现
  • 从谐振尖峰到稳定并网:一个LCL滤波器参数设计的完整调试实录(含MATLAB/Simulink模型)
  • 微信消息智能转发终极指南:5分钟实现跨群自动同步
  • VLLM 0.7.2离线推理实战:Qwen2.5-1.5B-Instruct模型部署避坑指南
  • 实战VDO.Ninja:构建企业级WebRTC直播系统的完整解决方案
  • Qwen3.5-4B-Claude-Opus入门必看:中文推理助手Web界面使用详解
  • 收藏 | AI大模型赋能中医创新:小白程序员必备学习指南
  • 5分钟掌握中文语义相似度计算:从基础概念到垂直领域实战指南
  • 计算机工程与应用2026最新投稿经验分享
  • 差分隐私参数黄金配比公式(ε:δ = 2.3:1e-5?):基于ACM FAccT 2023全量论文复现的稀缺性验证结论