2026/2/21 15:43:21
网站建设
项目流程
网站不备案可以做淘宝联盟吗,服饰技术支持 东莞网站建设,appstore官网入口,qq邮箱登录博主介绍#xff1a;✌全网粉丝10W#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室#xff0c;专注于计算机相关专业项目实战6年之久#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力#xff0c;已帮助成千上万的学生顺利毕业#xff0c;…博主介绍✌全网粉丝10W前互联网大厂软件研发、集结硕博英豪成立软件开发工作室专注于计算机相关专业项目实战6年之久累计开发项目作品上万套。凭借丰富的经验与专业实力已帮助成千上万的学生顺利毕业选择我们就是选择放心、选择安心毕业✌ 想要获取完整文章或者源码或者代做拉到文章底部即可与我联系了。点击查看作者主页了解更多项目感兴趣的可以先收藏起来点赞、关注不迷路大家在毕设选题项目以及论文编写等相关问题都可以给我留言咨询希望帮助同学们顺利毕业 。1、毕业设计2026年计算机专业毕业设计选题汇总建议收藏✅2、最全计算机专业毕业设计选题大全建议收藏✅1、项目介绍技术栈Python语言、 MySQL数据库 Django框架 Echarts可视化 、 协同过滤推荐算法 html美食列表瀑布流卡片展示全部菜品支持按菜系、口味、价格、评分多维度筛选与模糊搜索图片懒加载、分页滚动点击即进详情。美食详情页轮播主图、用料列表、制作步骤、营养标签集中呈现用户可收藏、打分、评论并即时查看“相似菜品”入口。美食推荐提供“猜你喜欢”与“口味邻居也在吃”双栏前者基于物品协同过滤后者基于用户协同过滤无刷新加载推荐结果。可视化分析①交互仪表板集成词云、折线、饼图三大组件任意切换维度与时间段图形联动一键导出高清图片用于汇报。词云图自动抽取菜名、食材、用户标签生成词云高频词汇突出显示鼠标悬停可查看关联菜品洞察流行口味。折线图动态展示价格、评分或销量随时间变化趋势支持区域缩放、节点标注帮助运营掌握市场波动。饼图直观对比各菜系、辣度、人群偏好占比支持钻取下一级分类颜色主题可一键切换。个人中心 注册登录 后台管理个人中心聚合收藏、足迹、评分记录与偏好标签支持头像修改与第三方绑定注册登录含滑块验证码、找回密码后台提供菜品、用户、订单、评论全模块CRUD支持批量导入、图片裁剪、敏感词过滤及操作日志审计运营人员无需代码即可维护全站数据。2、项目界面1美食列表2美食详情页3美食推荐—基于用户、基于物品4可视化分析12词云图分析3折线图分析4饼图分析5个人中心6美食分类7注册登录8后台数据管理3、项目说明美食列表瀑布流卡片展示全部菜品支持按菜系、口味、价格、评分多维度筛选与模糊搜索图片懒加载、分页滚动点击即进详情。美食详情页轮播主图、用料列表、制作步骤、营养标签集中呈现用户可收藏、打分、评论并即时查看“相似菜品”入口。美食推荐提供“猜你喜欢”与“口味邻居也在吃”双栏前者基于物品协同过滤后者基于用户协同过滤无刷新加载推荐结果。可视化分析①交互仪表板集成词云、折线、饼图三大组件任意切换维度与时间段图形联动一键导出高清图片用于汇报。词云图自动抽取菜名、食材、用户标签生成词云高频词汇突出显示鼠标悬停可查看关联菜品洞察流行口味。折线图动态展示价格、评分或销量随时间变化趋势支持区域缩放、节点标注帮助运营掌握市场波动。饼图直观对比各菜系、辣度、人群偏好占比支持钻取下一级分类颜色主题可一键切换。个人中心 注册登录 后台管理个人中心聚合收藏、足迹、评分记录与偏好标签支持头像修改与第三方绑定注册登录含滑块验证码、找回密码后台提供菜品、用户、订单、评论全模块CRUD支持批量导入、图片裁剪、敏感词过滤及操作日志审计运营人员无需代码即可维护全站数据。摘要随着大数据与人工智能时代的到来传统行业都发生了翻天覆地的变化餐饮行业也不例外但是在转型的过程中也会面临诸多挑战。在不同的领域应用经典的方法也会面临很多挑战为此本文在将推荐系统应用到美食中的时候融合美食领域的特点并使用协同过滤推荐算法应用于现实美食中用来解决面临的实际问题设计并实现了一个以 B/S 架构为基础的美食推荐系统。本系统使用Python语言结合Django框架进行开发运用协同过滤推荐算法完成通过用户的行为向其推荐美食的目的。后端主要使用Django框架前端页面的开发选择了Bootstrap框架和HTML。利用MySQL数据库存储美食信息。本系统的前端用户模块主要包括注册、登录、美食标签分类、美食推荐、美食列表、美食排序等、后台管理模块主要包括用户管理、美食美食管理、用户权限管理等。推荐算法方面同时含有基于用户的协同过滤以及基于物品的协同过滤推荐该系统具有一定的应用价值。关键词美食推荐 协同过滤算法 Python语言Django框架可视化4、核心代码# -*-coding:utf-8-*-importos os.environ[DJANGO_SETTINGS_MODULE]recommend.settingsimportdjango 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_userall_user# 通过用户名获得列表仅调试使用defgetItems(self,username1,username2):returnself.all_user[username1],self.all_user[username2]# 计算两个用户的皮尔逊相关系数defpearson(self,user1,user2):# 数据格式为美食id浏览此sum_xy0.0# user1,user2 每项打分的成绩的累加n0# 公共浏览次数sum_x0.0# user1 的打分总和sum_y0.0# user2 的打分总和sumX20.0# user1每项打分平方的累加sumY20.0# user2每项打分平方的累加formovie1,score1inuser1.items():ifmovie1inuser2.keys():# 计算公共的浏览次数n1sum_xyscore1*user2[movie1]sum_xscore1 sum_yuser2[movie1]sumX2pow(score1,2)sumY2pow(user2[movie1],2)ifn0:# print(p氏距离为0)return0moleculesum_xy-(sum_x*sum_y)/n# 分子denominatorsqrt((sumX2-pow(sum_x,2)/n)*(sumY2-pow(sum_y,2)/n))# 分母ifdenominator0:return0rmolecule/denominatorreturnr# 计算与当前用户的距离获得最临近的用户defnearest_user(self,current_user,n1):distances{}# 用户相似度# 遍历整个数据集foruser,rate_setinself.all_user.items():# 非当前的用户ifuser!current_user:distanceself.pearson(self.all_user[current_user],self.all_user[user])# 计算两个用户的相似度distances[user]distance closest_distancesorted(distances.items(),keyoperator.itemgetter(1),reverseTrue)# 最相似的N个用户print(closest user:,closest_distance[:n])returnclosest_distance[:n]# 给用户推荐美食defrecommend(self,username,n3):recommend{}nearest_userself.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(),keyoperator.itemgetter(1),reverseTrue)# 基于用户的推荐defrecommend_by_user_id(user_id):user_preferUserTagPrefer.objects.filter(user_iduser_id).order_by(-score).values_list(tag_id,flatTrue)current_userUser.objects.get(iduser_id)# 如果当前用户没有打分 则看是否选择过标签选过的话就从标签中找# 没有的话就按照浏览度推荐15个ifcurrent_user.rate_set.count()0:iflen(user_prefer)!0:movie_listxiangmu.objects.filter(tags__inuser_prefer)[:15]else:movie_listxiangmu.objects.order_by(-c9)[:15]returnmovie_list# 选取评分最多的10个用户users_rateRate.objects.values(user).annotate(mark_numCount(user)).order_by(-mark_num)user_ids[user_rate[user]foruser_rateinusers_rate]user_ids.append(user_id)usersUser.objects.filter(id__inuser_ids)#users 为评分最多的10个用户all_user{}foruserinusers:ratesuser.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_cfUserCf(all_userall_user)recommend_list[each[0]foreachinuser_cf.recommend(current_user.username,15)]movie_listlist(xiangmu.objects.filter(id__inrecommend_list).order_by(-c9)[:15])other_length15-len(movie_list)ifother_length0:fix_listxiangmu.objects.filter(~Q(rate__user_iduser_id)).order_by(-collect)forfixinfix_list:iffixnotinmovie_list:movie_list.append(fix)iflen(movie_list)15:breakreturnmovie_list# 计算相似度defsimilarity(movie1_id,movie2_id):movie1_setRate.objects.filter(movie_idmovie1_id)# movie1的打分用户数movie1_summovie1_set.count()# movie_2的打分用户数movie2_sumRate.objects.filter(movie_idmovie2_id).count()# 两者的交集commonRate.objects.filter(user_id__inSubquery(movie1_set.values(user_id)),moviemovie2_id).values(user_id).count()# 没有人给当前美食打分ifmovie1_sum0ormovie2_sum0:return0similar_valuecommon/sqrt(movie1_sum*movie2_sum)#余弦计算相似度returnsimilar_value#基于物品defrecommend_by_item_id(user_id,k15):# 前三的tag用户评分前三的美食user_preferUserTagPrefer.objects.filter(user_iduser_id).order_by(-score).values_list(tag_id,flatTrue)user_preferlist(user_prefer)[:3]print(user_prefer,user_prefer)current_userUser.objects.get(iduser_id)# 如果当前用户没有打分 则看是否选择过标签选过的话就从标签中找# 没有的话就按照浏览度推荐15个ifcurrent_user.rate_set.count()0:iflen(user_prefer)!0:movie_listxiangmu.objects.filter(tags__inuser_prefer)[:15]else:movie_listxiangmu.objects.order_by(-c9)[:15]print(from here)returnmovie_list# most_tags Tags.objects.annotate(tags_sumCount(name)).order_by(-tags_sum).filter(movie__rate__user_iduser_id).order_by(-tags_sum)# 选用户最喜欢的标签中的美食用户没看过的30部对这30部美食计算距离最近un_watchedxiangmu.objects.filter(~Q(rate__user_iduser_id),tags__inuser_prefer).order_by(?)[:30]# 看过的美食watchedRate.objects.filter(user_iduser_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(keylambdax:x[0],reverseTrue)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、源码获取方式由于篇幅限制获取完整文章或源码、代做项目的拉到文章底部即可看到个人联系方式。点赞、收藏、关注不迷路下方查看获取联系方式