基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现

1 简介

今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现

1. 协同过滤的算法思想

1.1. 基于内容的推荐中不足之处

基于内容的推荐方法用户易于理解,简单有效,但是它的缺点也十分明显。

  • 它要求内容必须能够抽取出有意义的特征,且要求这些特征内容有良好的结构性
  • 推荐精度较低,相同内容特征的物品差异性不大。因为以上这些原因,在推荐系统中基于内容的推荐往往会和其他方法混合使用。

1.2. 协同过滤算法思想推导

比如你想看一个电影,但是不知道具体看哪一部,你会怎么做?

  • 问问周围兴趣相似的朋友,看看他们最近有什么好的电影推荐。(基于用户)
  • 看看电影的相似程度,比如都喜欢看僵尸片,那就会找电影名带有僵尸、丧尸之类的电影。(基于物品)

比如到玩具店去给小男孩选玩具,应该怎么选?

  • 我看到大部分小男孩都在玩变形金刚,给他买个变形金刚怎么样?(基于用户)
  • 我知道这个小男孩有很多乐高模型,给他买一个最新版的乐高模型怎么样?(基于物品)

由此可以推导出协同过滤算法思想,如下所示:

  • 协同过滤算法就是基于上面的思想,主要包含基于用户的协同过滤推荐算法以及基于物品的协同过滤推荐算法。
  • 基于物品的协同过滤算法的核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品,用户U 购买了A 物品,推荐给用户U 和A 相似的物品B /C /D
  • 基于用户的协同过滤算法的核心思想:是先计算用户U 与其他的用户的相似度,然后取和U 最相似的几个用户,把他们购买过的物品推荐给用户U

1.3. 使用协同过滤算法的步骤

  1. 收集用户偏好。
  2. 找到相似的用户或者物品。
  3. 计算推荐。
  4. 评估

1.4. 使用协同过滤算法中需要注意的点

这里的基于物品的协同过滤和之前的基于内容的推荐算法不一样,基于内容的推荐算法仅仅考虑物品的内容特征,而协同过滤包括物品+用户

这里的基于用户的协同过滤和之前的基于人口统计学推荐算法不一样,基于人口统计学推荐算法考虑的是用户的基本属性(用户画像),基于用户的协同过滤考虑的是用户的对于物品的评价(喜好)

协同:用户与用户之间、用户和网站之间等进行不断的互动,慢慢过滤掉自己不感兴趣的物品,从而满足自己的需求。

2. 协同过滤的推荐方法

协同过滤和基于内容这2种方法对比:

  • 基于内容(Content based,CB)主要利用的是用户评价过的物品的内容特征,而基于协同过滤(Collaboraitive Filtering,CF)方法还可以利用其他用户评分过的物品内容

  • CF可以解决CB的一些局限

    • 物品内容不完全或者难以获得时,依然可以通过其他用户的反馈给出推荐
    • CF基于用户之间对物品的评价质量,避免了CB仅依赖内容可能造成的对物品质量判断的干扰
    • CF推荐不受内容限制,只要其他类似用户给出了对不同物品的兴趣,CF就可以给用户推荐出内容差异很大的物品(但有某种内在联系)

协同过滤的方法分类:

  • 基于近邻的协同过滤:

    • 基于用户(User-CF)
    • 基于物品(Item-CF)
  • 基于模型的协同过滤:

    • 奇异值分解(SVD)
    • 潜在语义分析(LSA)
    • 支持向量机(SVM)

3. 基于近邻的协同过滤

3.1. 什么是基于近邻的协同过滤

  • 基于用户的协同过滤(UserCF):给用户推荐和用户相似的其他用户喜欢的东西。
  • 基于物品的协同过滤(ItemCF):给用户推荐和用户喜欢的东西相似的其他东西。
  • 基于近邻的推荐系统根据的是相同 “口碑” 准则,如下所示,是否应该给Cary推荐《泰坦尼克号》?答案是肯定的

3.2. 基于用户的CF

用户A喜欢的物品用户C都喜欢,我们认为用户A与用户C相似,

那么用户C喜欢的东西可能用户A也喜欢,因此将用户C喜欢的物品推荐给用户A。

思想总结如下:

  • 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,并推荐近邻所偏好的物品

  • 在一般的应用中是采用计算“K-近邻”的算法;基于这 K 个邻居的历史偏好信息,为当前用户进行推荐

  • User-CF和基于人口统计学的推荐机制

    • 两者都是计算用户的相似度,并基于相似的“邻居”用户群计算推荐
    • 它们所不同的是如何计算用户的相似度:基于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制可是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的口味和偏好

模型核心算法伪代码表示如下:

基于该核心算法,完成用户商品矩阵:

预测用户对于未评分的物品的分值,然后按照降序排序,进行推荐。

3.3. 基于物品的CF

喜欢物品A的用户都喜欢物品C,那么我们认为物品A与物品C相似,

那么喜欢物品A的用户也可能会喜欢物品C,因此,将物品C推荐给喜欢物品A的用户。

思想总结如下:

  • 基于项目的协同过滤推荐的基本原理与基于用户的类似,只是使用所有用户对物品的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户

  • Item-CF和基于内容(CB)的推荐

    • 其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息
  • 同样是协同过滤,在基于用户和基于项目两个策略中应该如何选择呢?

    • 电商、电影、音乐网站,用户数t远大于物品数量
    • 新闻网沾,物品(新闻文本)数员可能大于用户数量

2 设计概要

4.2系统整体模块
系统功能
1、 为商家提供可运营的平台;
2、 在系统中可以为商家添加的菜品进行营养成分分析;
3、 用户需要登陆注册自己的个人账号;
4、 为用户提供点餐系统;
5、 用户可在营养查询界面进行食物的营养成分查询
6、 用户可以查询自己的历史饮食记录
7、 用户可以自行输入每餐获得相应的营养卡和标准营养卡的对比。
餐饮系统模块功能:
用户注册:主要是实现用户的注册功能。
用户登录:监测对象输入相关的个人信息登录系统,登录成功后,会进入系统主界面。
搜索:可查询各种食材的营养含量。
后台管理部分
系统的后台主要负责对系统数据库的定期维护和营养医师对食物和菜肴的添加
和修改,以下是其主要功能的简单描述:
食物信息管理:对食物种类、食物信息的添加、删除和查询。
菜肴信息管理:对菜肴种类、菜肴信息的添加、删除和查询。
早餐信息管理:对早餐种类、菜肴信息的添加、删除和查询。
营养分析系统功能:
膳食分析:监测对象可以通过主界面进入膳食分析界面,膳食分析主要根据用户录入的膳食信息,实现对监测对象进行膳食分析,并显示膳食分析的结果。
自动配餐:根据用户当前的状态和用户主食、水果等的选择,自动选择菜肴,并给出自动配餐的结果和菜肴的营养素含量。
用户偏好:显示、修改监测对象的饮食偏好,包括偏好和忌口。
用户建议:显示监测对象提出的建议,提供用户提出建议的方式。

4.2系统整体模块图
在这里插入图片描述

4.2.1注册登录模块
用户进行系统使用前需要先进行登录,登录时会对用户输入的账号和密码进行检测,如果存在则验证正确性,如果不存在则会提示注册。用户注册时,会对用户输入的账号进行检测,如果数据库中存在相同账号则不能进行注册,在注册完毕之后,会提示注册成功,并询问是否返回登录。详细的登录注册流程图如下:
在这里插入图片描述
在这里插入图片描述

4.3注册登录模块流程图
4.2.2点菜模块
点菜模块中有膳食营养分析系统的参与,帮助用户更好的从源头抓起在一定程度上改善饮食健康。用户在开始点菜之前需要提前选择这次餐的类型,系统会根据用户选择在已有菜品中进行挑选,但是由于单一类型的过量食用依旧会对健康造成影响,所以在提交菜单之后系统会自动对菜品进行评估并给出建议。点餐流程图如下:

4.4点菜模块流程图
4.2.3用户模块
用户在个人信息中填写个人健康状况,系统根据用户健康推荐相应的饮食类型;用户可在历史记录中查询近期的饮食情况;膳食营养分析系统会在每次用户用餐完成之后给出营养表单,此表单也位于历史记录之中可供查看;用户可在查询单元中搜索食材的营养含量便于在系统不便于计算时自行调整,系统也将提供营养计算器,供用户自行使用。

4.5用户模块用例图
4.3系统算法模块
膳食营养分析系统主要运用聚类算法和网络爬虫两大算法,其中聚类算法主要解决系统推荐菜谱问题,通过聚类算法将相近的数据进行拉拢达到简化的目的,而爬虫则是解决营养数据来源问题,通过网络爬虫技术将网络上开源的权威营养成分信息进行抓取,再通过数据处理手段进行数据再整合以符合系统所需。本次将采用主题网络爬虫的技术来进行。相比于通用网络爬虫,主题网络爬虫的目标是抓取特定主题页面,过滤无关页面,其特点是专而精。主题网络爬虫能够减轻系统消耗,节约宽带资源[9]。

4.6爬虫算法模块流程图
在这里插入图片描述
在这里插入图片描述

3 系统关键技术

使用springboot,vue,mysql, mybaties, typescript, html ,css, js 等进行开发

4 开发工具

开发工具主要有:idea、jdk1.8、maven、mysql5.7、Navicat等。

5 代码展示

@RequestMapping("/strategy")
@RestController
@Scope("prototype")
public class StrategyController {
    
    
    @Autowired
    private StrategyService strategyService;
    @Value("${web.upload-path}")
    private String path;

    @RequestMapping("/findPage")
    public ObjDat<Strategy> findPage(Strategy strategy, @RequestParam(value="page", defaultValue="1") int page, @RequestParam(value="limit", defaultValue="10") int limit){
    
    
        return strategyService.findPage(strategy,page-1,limit);
    }

    @RequestMapping("/edit")
    public JsonResult edit(HttpServletRequest request, Strategy strategy) throws IOException {
    
    
        User user=(User)request.getSession().getAttribute("user");
        if(user==null){
    
    
            return JsonResult.error("请登录");
        }
        String str=strategyService.edit(request,strategy);
        if(str.equals("成功")){
    
    
            return JsonResult.success("操作成功");
        }else{
    
    
            return JsonResult.error("操作失败");
        }
    }

6 系统功能描述

项目功能演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42135426/article/details/128536304
今日推荐