基于深度学习的饮食计划推荐与交流分享平台

前言介绍

课题背景与意义

随着现代生活节奏的加快,人们的饮食习惯发生了显著变化。工作繁忙、生活压力大等因素使得许多人难以保证饮食的均衡和营养,进而导致各种健康问题的出现。慢性病的发病率在全球范围内不断上升,如心血管疾病、糖尿病和高血压等,这些疾病与饮食习惯密切相关。传统的饮食管理方式往往缺乏个性化和科学性,难以满足不同人群的多样化需求。近年来,人工智能和深度学习技术的飞速发展为解决这一问题提供了新的思路和方法。深度学习能够通过分析大量的用户数据,包括饮食习惯、营养需求和健康状况等,为用户提供个性化的饮食建议。一些研究团队已经利用深度学习技术开发出能够根据用户输入的食材推荐健康食谱的系统。还有研究通过分析餐厅菜单项的名称来预测其营养质量,帮助消费者做出更健康的饮食选择。这些技术的应用不仅提高了饮食建议的准确性和实用性,也为健康饮食管理带来了新的机遇。

该平台能够根据用户的个人健康信息、饮食习惯和营养需求,提供科学、合理且个性化的饮食建议,帮助用户养成健康的饮食习惯,从而有效预防和控制慢性病的发生和发展。通过深度学习技术,该平台可以实现对用户饮食行为的实时监测和反馈,及时发现饮食中的问题并提供改进建议,进一步提升用户的健康管理能力。该平台还提供了一个交流分享的社区,用户可以在这里分享自己的饮食经验、交流健康知识,促进健康饮食理念的传播和推广。这不仅有助于提高公众的健康意识,还能为社会公共卫生事业做出积极贡献。从技术角度来看,该平台的开发将进一步推动深度学习技术在健康领域的应用和发展,为未来相关研究提供宝贵的经验和参考。

01开发环境

1.1 Java 技术

1.2 Spring Boot 框架

1.3 Hadoop

1.4 MySQL数据库

1.5 B/S 结构

1.6 Vue.js 技术

1.7 协同过滤算法

1.8 决策树算法

02系统功能模块

亮点(协同过滤算法(余弦相似度计算推荐),机器学学决策树算法、数据导入,数据分析和预测、Echarts可视化大屏)

1、数据管理:信息列表展示。

2、数据存储:mysql数据库。

3、可视化分析:大数据分析统计后图表大屏展示

4、情感分析预测:根据食物特征信息决策树预测。

5、数据分析:根据hadoop大数据技术进行数据分析

具体运用基于用户的协同过滤方法,借助解析用户收藏行为数据,辨别出和目标用户有着相似兴趣偏好的用户群体,再依照这些相似用户的历史记录为目标用户生成个性化的推荐列表。

协同过滤算法的核心机制是依靠量化用户之间的相似性程度达成个性化推荐,在这个过程中,余弦相似度作为经典的相似性度量办法,在该领域得到了广泛运用。

余弦相似度计算公式:
在这里插入图片描述

04图片展示

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后台管理系统

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

05系统文档、代码展示

5.1 系统文档
在这里插入图片描述

5.2 代码展示

/**
    * 机器学习决策树预测算法(交流学习+vx:S20231025S )
    */
    @RequestMapping("/forecast")
    public R forecast(@RequestBody Map<String, Object> params) throws Exception {
        // 特征值
        String[] eigenValueArr = "heat,protein,fat,carbohydrate".split(",");
        // 目标值
        String[] targetValueArr = "foodcategory".split(",");
        String[] sqlSelectArr = Stream.of(eigenValueArr, targetValueArr).flatMap(Arrays::stream).toArray(String[]::new);
        // 模型训练
        Wrapper<DietplanEntity> wrapper = new EntityWrapper<>();
        wrapper.setSqlSelect(sqlSelectArr);
        for (String arr : sqlSelectArr) {
            wrapper.isNotNull(arr).ne(arr, "");
        }
        // 从数据库获取需要元数据
        List<Map<String,Object>> list =dietplanService.selectMaps(wrapper);
        // 模型训练
        Instances instances = createInstances(list, sqlSelectArr);
        // 创建一个map来存储预测结果
        Map<String, Object> forecastRes = forecastRes(instances, params, eigenValueArr, targetValueArr);
        // 更新数据库或其他操作
        EntityWrapper<DietplanforecastEntity> ew = new EntityWrapper<>();
        ew.eq("id", params.get("id"));
        for (Map.Entry<String, Object> entry : forecastRes.entrySet()) {
            String updateSet = entry.getKey() + "='" + entry.getValue().toString() + "'";
            dietplanforecastService.updateForSet(updateSet, ew);
        }
        params.putAll(forecastRes);
        return R.ok(params);
    }
 /**
    * 训练模型
    */
    private Instances createInstances(List<Map<String, Object>> dataList, String[] attrs) throws Exception {
        // 遍历数据集以确定每个属性的类型
        Map<String, Set<Object>> uniqueValuesPerAttribute = new HashMap<>();
        for (Map<String, Object> data : dataList) {
            for (String attr : attrs) {
                uniqueValuesPerAttribute.computeIfAbsent(attr, k -> new HashSet<>()).add(data.get(attr));
            }
        }
        FastVector attributes = new FastVector();
        for (String attr : attrs) {
            Set<Object> uniqueValues = uniqueValuesPerAttribute.get(attr);
            if (isNominal(uniqueValues)) {
                // 如果是分类属性,创建分类属性
                FastVector nominalValues = new FastVector();
                uniqueValues.forEach(value -> nominalValues.addElement(value));
                nominalValues.add("unknown");
                attributes.addElement(new Attribute(attr, nominalValues));
            } else {
                attributes.addElement(new Attribute(attr));
            }
        }
    /*
     *基于用户的协同过滤算法(采用余弦相似性计算推荐)
     */
   public double calculateSimilarity(String user1, String user2) {
        //计算用户之间的相似度【余弦相似性】
        Integer id1 = this.userIndex.get(user1);
        Integer id2 = this.userIndex.get(user2);
        if(id1==null || id2==null) return 0.0;
        return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings.get(indexUser.get(id1)).size()*userRatings.get(indexUser.get(id2)).size());
    }
    public List<String> recommendItems(String targetUser, int numRecommendations) {
        // 计算目标用户与其他用户的相似度
        Map<String, Double> userSimilarities = new HashMap<>();
        for (String user : userRatings.keySet()) {
            if (!user.equals(targetUser)) {
                double similarity = calculateSimilarity(targetUser, user);
                userSimilarities.put(user, similarity);
            }
        }
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐