《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》

一、功能模块图

二、系统总体架构

系统基于若依框架分层架构设计,从下到上分为数据服务层业务逻辑层交互展现层,支撑移动端(普通用户)与后台管理端(管理员)的核心功能

具体架构职责如下:

|-------|-------------|------------------------------------------------------------------|
| 架构层级 | 核心职责 | 关键实现 |
| 数据服务层 | 数据存储与交互支撑 | 调用自定义接口与MySQL数据库交互,处理用户、菜品、食材、营养参考值等数据的增删改查,为上层提供基础数据支撑 |
| 业务逻辑层 | 功能逻辑处理与算法计算 | 解析用户请求,结合改进协同过滤(UPICF)多目标粒子群(MOPSO) 算法处理数据,以JSON格式返回结果 |
| 交互展现层 | 用户与系统的交互窗口 | 移动端(Android APP)提供用户操作界面;后台管理端(Web浏览器)提供管理员数据管理界面 |

三、 数据库表

核心ER图

基于若依的数据表

|----|--------------------------|-------------|
| 序号 | 表名 | 作为 |
| 1 | gen_table | 代码生成业务表 |
| 2 | gen_table_column | 代码生成业务表字段 |
| 3 | qrtz_blob_triggers | Blob类型的触发器表 |
| 4 | qrtz_calendars | 日历信息表 |
| 5 | qrtz_cron_triggers | Cron类型的触发器表 |
| 6 | qrtz_fired_triggers | 已触发的触发器表 |
| 7 | qrtz_job_details | 任务详细信息表 |
| 8 | qrtz_locks | 存储的悲观锁信息表 |
| 9 | qrtz_paused_trigger_grps | 暂停的触发器表 |
| 10 | qrtz_scheduler_state | 调度器状态表 |
| 11 | qrtz_simple_triggers | 简单触发器的信息表 |
| 12 | qrtz_simprop_triggers | 同步机制的行锁表 |
| 13 | qrtz_triggers | 触发器详细信息表 |
| 14 | sys_config | 参数配置表 |
| 15 | sys_dept | 部门表 |
| 16 | sys_dict_data | 字典数据表 |
| 17 | sys_dict_type | 字典类型表 |
| 18 | sys_job | 定时任务调度表 |
| 19 | sys_job_log | 定时任务调度日志表 |
| 20 | sys_logininfor | 系统访问记录 |
| 21 | sys_menu | 菜单权限表 |
| 22 | sys_notice | 通知公告表 |
| 23 | sys_oper_log | 操作日志记录 |
| 24 | sys_post | 岗位信息表 |
| 25 | sys_role | 角色信息表 |
| 26 | sys_role_dept | 角色和部门关联表 |
| 27 | sys_role_menu | 角色和菜单关联表 |
| 28 | sys_user | 用户信息表 |
| 29 | sys_user_post | 用户与岗位关联表 |
| 30 | sys_user_role | 用户和角色关联表 |

新增数据表

一、用户健康信息表(user_health_info)支撑UPICF

|-------------------|---------|----|------|----|-------------------------------------|--------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 用户ID(关联系统用户) | sys_user(id) |
| age | int | 3 | 否 | 否 | 用户年龄(如18-60) | - |
| height | int | 3 | 否 | 否 | 身高(cm,如170) | - |
| weight | int | 3 | 否 | 否 | 体重(kg,如70) | - |
| occupation | varchar | 50 | 是 | 否 | 职业(如"办公室职员""建筑工人") | - |
| activity_level | tinyint | 1 | 否 | 否 | 体力活动水平:1=轻(办公室职员)、2=中(教师)、3=重(建筑工人) | - |
| flavor_preference | varchar | 50 | 是 | 否 | 口味偏好(如"辣""甜""鲜") | - |

二、菜品信息表(dish_info)支撑UPICF、MOPSO

|------------------|----------|-----|------|----|--------------------|----------------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| dish_name | varchar | 100 | 否 | 否 | 菜品名称(如"木耳炒肉") | - |
| cuisine | varchar | 50 | 是 | 否 | 菜系(如"川菜""粤菜") | - |
| taste | varchar | 50 | 是 | 否 | 口味(枚举:辣/甜/鲜/咸/清淡) | - |
| cooking_method | varchar | 20 | 否 | 否 | 烹饪方式(枚举:煎/炒/煮/蒸/烤) | 考虑中 |
| calories | decimal | 6,2 | 是 | 否 | 热量(千卡/100克) | |
| protein | decimal | 5,2 | 是 | 否 | 蛋白质(克/100克) | |
| fat | decimal | 5,2 | 是 | 否 | 脂肪(克/100克) | |
| carbohydrate | decimal | 5,2 | 是 | 否 | 碳水化合物(克/100克) | |
| fiber | decimal | 5,2 | 是 | 否 | 纤维素(克/100克,如3.50) | |
| img_url | varchar | 255 | 是 | 否 | 菜品图片URL | - |
| create_by | varchar | 64 | 否 | 否 | 创建人(管理员ID) | sys_user(username) |
| create_time | datetime | - | 否 | 否 | 创建时间 | - |
| update_by | varchar | 64 | 是 | 否 | 更新人 | sys_user(username) |
| update_time | datetime | - | 是 | 否 | 更新时间 | - |

三、食材信息表(ingredient_info)支撑MOPSO
支撑MOPSO营养规划

用途:存储食材营养数据,支撑营养规划算法(MOPSO),数据源自《中国食物成分表》。

|--------------|----------|-----|------|----|------------------|-----|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| igd_name | varchar | 100 | 否 | 否 | 食材名称(如"黑木耳""猪肉") | - |
| igd_category | varchar | 50 | 是 | 否 | 食材类别(如"蔬菜类""肉类") | - |
| calories | decimal | 6,2 | 是 | 否 | 热量(千卡/100克) | - |
| protein | decimal | 5,2 | 是 | 否 | 蛋白质(克/100克) | - |
| fat | decimal | 5,2 | 是 | 否 | 脂肪(克/100克) | - |
| carbohydrate | decimal | 5,2 | 是 | 否 | 碳水化合物(克/100克) | - |
| fiber | decimal | 5,2 | 是 | 否 | 纤维素(克/100克) | |
| create_time | datetime | - | 否 | 否 | 创建时间 | - |
| update_time | datetime | - | 是 | 否 | 更新时间 | - |

四、菜品-食材关联表(dish_ingredient_rel)支撑MOPSO

用途:关联菜品与食材,记录食材在菜品中的用量比例(多对多关系)。

菜品-食材关联表(dish_ingredient):支撑MOPSO营养计算

|---------------|----------|--------|----------|--------|-------------------------------|-----------------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| dish_id | bigint | 20 | 否 | 否 | 菜品ID(关联dish_info.id ) | dish_info(id) |
| igd_id | bigint | 20 | 否 | 否 | 食材ID(关联ingredient_info.id ) | ingredient_info(id) |
| quantity | decimal | 6,2 | 否 | 否 | 用量(克,如100.00) | - |
| unit | varchar | 10 | 是 | 否 | 单位(如"克""个") | - |
| create_time | datetime | - | 否 | 否 | 创建时间 | - |

五、菜品评分表(dish_rating)支撑UPICF

用途:存储用户对菜品的评分,支撑改进协同过滤算法(UPICF)的偏好预测。

|-------------|-------------------|----|------|----|----------------------|-----------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 用户ID | sys_user(id) |
| dish_id | bigint | 20 | 否 | 否 | 菜品ID | dish_info(id) |
| rating | tinyint | 1 | 否 | 否 | 评分值(1~5分) | - |
| rating_time | datetime | - | 否 | 否 | 评分时间(用于时间权重计算) | - |
| unique key | (user_id,dish_id) | - | - | - | 唯一约束(同一用户对同一菜品仅能评一次) | - |

六、饮食记录表(food_record)支撑UPICF

用途:记录用户选择的菜品及食用量,用于推荐时排除"近3日已食用菜品"。

|-------------------|----------|----|------|----|-------------------------------------|-----------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 用户ID | sys_user(id) |
| dish_id | bigint | 20 | 否 | 否 | 菜品ID | dish_info(id) |
| eat_time | datetime | - | 否 | 否 | 食用时间 | - |
| ingredient_amount | text | - | 是 | 否 | 食材食用量(JSON格式,如{"黑木耳":79.1,"猪肉":50}) | - |
| create_time | datetime | - | 否 | 否 | 记录创建时间 | - |

七、意见反馈表(opinion_feedback)支撑UPICF

用途:存储用户反馈信息,支撑管理员后台的反馈处理功能。

|---------------|----------|----|------|----|--------------------|----------------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 反馈用户ID | sys_user(id) |
| feedback_type | varchar | 50 | 否 | 否 | 反馈类型(如"功能bug""建议") | - |
| content | text | - | 否 | 否 | 反馈内容(5~200字) | - |
| handle_status | tinyint | 1 | 否 | 否 | 处理状态:0=未处理、1=已处理 | - |
| handle_remark | text | - | 是 | 否 | 处理备注(管理员填写) | - |
| handle_by | varchar | 64 | 是 | 否 | 处理人 | sys_user(username) |
| submit_time | datetime | - | 否 | 否 | 提交时间 | - |
| handle_time | datetime | - | 是 | 否 | 处理时间 | - |

八、用户-菜品交互表(user_dish_interaction):支撑UPICF核心

用途 :存储用户对菜品的行为数据 (如评分、收藏),是UPICF计算用户偏好菜品相似性 的基础。 关键说明interaction_type(交互类型)用枚举值 (评分/收藏/点击),rating(评分)仅当交互类型为"评分"时有效,count(次数)仅当交互类型为"点击"时有效。

|--------------------|----------|--------|----------|--------|-------------------------|-----------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 用户ID(关联user_info.id ) | user_info(id) |
| dish_id | bigint | 20 | 否 | 否 | 菜品ID(关联dish_info.id ) | dish_info(id) |
| interaction_type | varchar | 20 | 否 | 否 | 交互类型(枚举:评分/收藏/购买/点击) | - |
| rating | tinyint | 1 | 是 | 否 | 评分(1-5分,仅评分时有效) | - |
| count | int | 10 | 是 | 否 | 次数(仅点击时有效) | - |
| create_time | datetime | - | 否 | 否 | 创建时间 | - |

九. 用户营养需求表(user_nutrition_goal):支撑MOPSO目标函数

用途 :存储用户每日营养目标 (如热量1500千卡、蛋白质100克),是MOPSO多目标优化 的输入(如最小化热量、最大化蛋白质)。 关键说明calorie_goal(热量目标)用千卡protein_goal(蛋白质目标)用,统一单位确保计算准确性。

|---------------------|----------|--------|----------|--------|-------------------------|-----------------|
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 说明 | 关联表 |
| id | bigint | 20 | 否 | 是 | 主键ID | - |
| user_id | bigint | 20 | 否 | 否 | 用户ID(关联user_info.id ) | user_info(id) |
| calorie_goal | decimal | 6,2 | 否 | 否 | 热量目标(千卡/天,如1500.00) | - |
| protein_goal | decimal | 5,2 | 否 | 否 | 蛋白质目标(克/天,如100.00) | - |
| fat_goal | decimal | 5,2 | 否 | 否 | 脂肪目标(克/天,如50.00) | - |
| carbohydrate_goal | decimal | 5,2 | 否 | 否 | 碳水化合物目标(克/天,如200.00) | - |
| fiber_goal | decimal | 5,2 | 否 | 否 | 纤维素目标(克/天,如25.00) | - |
| create_time | datetime | - | 否 | 否 | 创建时间 | - |

四、模型数据来源

用户数据来源

发放调查问卷40份 ,回收38份,有效33份;附件1

调查问卷
复制代码
第一部分:基础信息与健康画像
1. 基本信息
信息类别	填写 / 选择项
性别	□ 男 □ 女
年龄	__________ 岁
身高	__________ cm
体重	__________ kg
职业	________________________(请填写具体职业,如:学生 / 程序员 / 教师等)
2. 身体活动水平(请选择最符合的一项)
□ 轻度活动(久坐办公 / 学习,基本无额外运动)
□ 中度活动(每周 3-5 次中等强度运动,如快走、骑车)
□ 重度活动(每周 5 次以上高强度运动,或体力劳动工作)
3. 您的健康目标(可多选,需补充内容请填写)
□ 减肥 / 控制体重
□ 增肌 / 健身塑形
□ 维持当前状态
□ 改善特定健康状况:________________________
□ 其他:________________________
4. 饮食限制与偏好
限制 / 偏好类别	填写 / 选择项
饮食类型	□ 普通饮食 □ 素食 □ 低糖饮食 □ 低脂饮食 □ 高蛋白饮食 □ 其他:__________
食物过敏	□ 无 □ 有:________________________(请填写具体过敏食物)
口味禁忌	□ 无 □ 不吃辣 □ 不吃甜 □ 其他:________________________
第二部分:口味偏好详细评分
请根据您的喜好程度为以下菜品评分(1 = 很不喜欢,2 = 不太喜欢,3 = 一般,4 = 比较喜欢,5 = 非常喜欢),在对应分数的□内打 "√"。
主食类
菜品	1 分(很不喜欢)	2 分(不太喜欢)	3 分(一般)	4 分(比较喜欢)	5 分(非常喜欢)
白米饭	□	□	□	□	□
面条 / 米粉	□	□	□	□	□
饺子 / 馄饨	□	□	□	□	□
馒头 / 包子	□	□	□	□	□
粥类	□	□	□	□	□
荤菜类
菜品	1 分(很不喜欢)	2 分(不太喜欢)	3 分(一般)	4 分(比较喜欢)	5 分(非常喜欢)
红烧肉	□	□	□	□	□
清蒸鱼	□	□	□	□	□
宫保鸡丁	□	□	□	□	□
番茄炒蛋	□	□	□	□	□
糖醋里脊	□	□	□	□	□
素菜类
菜品	1 分(很不喜欢)	2 分(不太喜欢)	3 分(一般)	4 分(比较喜欢)	5 分(非常喜欢)
麻婆豆腐	□	□	□	□	□
炒青菜	□	□	□	□	□
地三鲜	□	□	□	□	□
酸辣土豆丝	□	□	□	□	□
西红柿炒鸡蛋	□	□	□	□	□
汤品类
菜品	1 分(很不喜欢)	2 分(不太喜欢)	3 分(一般)	4 分(比较喜欢)	5 分(非常喜欢)
番茄蛋汤	□	□	□	□	□
紫菜蛋花汤	□	□	□	□	□
排骨汤	□	□	□	□	□
5. 您还特别喜欢哪些菜品?请列出 3-5 个:



1. ________________________(可选)
2. ________________________(可选)
第三部分:口味属性偏好
6. 您对以下口味的偏好程度(1 = 很不喜欢,2 = 不太喜欢,3 = 一般,4 = 比较喜欢,5 = 非常喜欢)
口味属性	1 分	2 分	3 分	4 分	5 分
辣味程度	□	□	□	□	□
甜味程度	□	□	□	□	□
咸味程度	□	□	□	□	□
酸味程度	□	□	□	□	□
油腻程度	□	□	□	□	□
清淡程度	□	□	□	□	□
7. 烹饪方式偏好(可多选,在□内打 "√")
□ 炒菜 □ 蒸菜 □ 煮汤 □ 炖菜 □ 凉拌 □ 烧烤 □ 油炸 □ 无特殊偏好
8. 食材类别偏好(可多选,在□内打 "√")
□ 猪肉 □ 牛肉 □ 鸡肉 □ 鱼肉 □ 海鲜 □ 豆制品 □ 叶菜类 □ 根茎类 □ 菌菇类
第四部分:饮食行为与习惯
9. 日常用餐规律(每题单选,在□内打 "√")
用餐时段	选项
早餐	□ 每天都吃 □ 经常吃 □ 偶尔吃 □ 基本不吃
午餐	□ 规律 □ 不规律
晚餐	□ 规律 □ 不规律
夜宵	□ 从不 □ 偶尔 □ 经常
10. 主要饮食来源(可多选,在□内打 "√")
□ 自己做饭 □ 食堂 □ 外卖 □ 餐馆 □ 家人准备
11. 您通常关注菜品的哪些方面?(请按重要性排序,1 为最重要,在括号内填 1-6 的数字,不重复)
() 口味好吃 () 营养价值 ( ) 热量控制 ( ) 食材新鲜 ( ) 制作便捷 ( ) 价格实惠
第五部分:营养健康认知
12. 在选择食物时,您对以下因素的重视程度(1 = 非常不重视,2 = 不重视,3 = 一般,4 = 重视,5 = 非常重视)
营养因素	1 分(非常不重视)	2 分(不重视)	3 分(一般)	4 分(重视)	5 分(非常重视)
热量 / 卡路里	□	□	□	□	□
蛋白质含量	□	□	□	□	□
脂肪含量	□	□	□	□	□
碳水化合物	□	□	□	□	□
维生素含量	□	□	□	□	□
膳食纤维	□	□	□	□	□
13. 您是否愿意为了健康适当调整饮食口味?(单选,在□内打 "√")
□ 非常愿意 □ 比较愿意 □ 一般 □ 不太愿意 □ 完全不愿意
14. 您希望推荐系统重点关注什么?(最多选 3 项,在□内打 "√",需补充内容请填写)
□ 符合我的口味偏好
□ 保证营养均衡
□ 控制总热量摄入
□ 提供多样化的选择
□ 考虑我的作息时间
□ 适应我的烹饪条件
□ 其他:________________________

填写说明:1. 请用黑色或蓝色笔填写,勾选选项时打 "√";2. 需补充内容的项目,请在横线处清晰填写;3. 问卷填写完成后,可直接打印或导出为 PDF 存档。
问卷分析
性别分布

|--------|--------|
| 性别 | 数量 |
| 男 | 17 |
| 女 | 16 |

不同健康目标下的饮食类型偏好热力图

菜品数据来源

来自爬取薄荷健康-1635道 涵盖菜品分布的菜系有山东菜、广东菜、北京菜、湖南菜、上海菜、四川菜、江西菜、河南菜、福建菜、浙江菜、山西菜、东北菜、滇黔菜、湖北菜、江苏菜、甘肃菜、安徽菜、陕西菜、台湾菜、新疆菜、海南菜、广西菜、天津菜、青海菜、宁夏菜。附件2

菜品分类分布
菜品热量分布

五、数据处理

针对33份用户数据扩展到960名用户,扩展倍数为30倍。通过:1.数值型增强、2.类别型增强 、3.特征插值增强、4.模式增强 、5.语义增强,增强后用户数据 附件3

增强方法

1. 数值型增强 (Numerical Augmentation)

原理:对用户的数值型偏好特征添加高斯噪声进行轻微扰动,生成相似但略有差异的用户数据。

实现方式

  • 对每个原始用户生成5个变体
  • 对数值特征(如口味偏好、营养关注等)添加符合正态分布的噪声
  • 噪声范围控制在±0.5到±0.8之间
  • 保证扰动后的值在1-5的有效范围内

特征范围

  • 口味偏好:spicy_preference, sweet_preference, salty_preference, sour_preference, greasy_preference, light_preference
  • 营养关注:calorie_focus, protein_focus, fat_focus, carb_focus, vitamin_focus, fiber_focus
2. 类别型增强 (Categorical Augmentation)

原理:基于用户群体特征(性别和BMI分类)进行分组,同组用户之间交换部分特征,生成新的用户组合。

实现方式

  • 按照性别和BMI类别对用户进行分组
  • 在每组内部随机选择两个用户进行特征交换
  • 交换特征包括:口味偏好和饮食规律性特征
  • 每组最多生成3个组合变体
3. 特征插值增强 (Interpolation Augmentation)

原理:采用SMOTE(Synthetic Minority Oversampling Technique)思想,对相似用户进行线性插值生成中间用户。

实现方式

  • 使用KNN算法找到相似用户对
  • 对数值特征进行线性插值:interpolated = user1[col] * alpha + user2[col] * (1 - alpha)
  • 插值系数alpha在0.3-0.7之间随机选择
  • 每对相似用户生成2-3个插值变体
4. 模式增强 (Pattern Augmentation)

原理:识别并过采样少数用户模式,确保所有用户群体在增强数据中得到充分表示。

实现方式

  • 基于健康目标和口味偏好强度识别用户模式
  • 对用户数少于5个的少数模式进行过采样
  • 为每个少数模式用户生成3-5个轻微扰动变体
  • 扰动范围限制在±1以内
5. 语义增强 (Semantic Augmentation)

原理:结合地域饮食文化和健康目标模板,生成具有特定语义特征的用户数据。

实现方式

  • 基于6个中国主要地域的饮食偏好模板(四川、广东、江苏、湖南、浙江、山东)
  • 为每个原始用户随机选择2-3个地域
  • 将用户原始偏好与地域特征进行混合:blended_value = (original_value + template_value) / 2
  • 结合用户主要健康目标模板进一步调整相关特征

数据后处理

去重策略
  • 基于关键特征(gender, age, bmi, spicy_preference, light_preference)进行去重
  • 确保生成的用户数据具有足够的多样性
数量调整
  • 若去重后数据不足目标数量,通过随机复制补充
  • 若去重后数据超出目标数量,通过随机抽样调整
  • 最终确保生成恰好960名用户的数据集
地域饮食偏好模板

系统内置了6个中国主要地域的饮食偏好模板:

  1. 四川:偏好辣味、咸味、酸味和油腻食物
  2. 广东:偏好甜味和清淡食物
  3. 江苏:偏好甜味和清淡食物,适量咸味
  4. 湖南:偏好辣味、咸味和酸味
  5. 浙江:偏好甜味和清淡食物,适量咸味
  6. 山东:偏好咸味和油腻食物
健康目标模板

系统针对三种主要健康目标设置了特征权重模板:

  1. 减重目标:重点关注热量、脂肪、碳水化合物和纤维
  2. 增肌目标:重点关注蛋白质、热量和碳水化合物
  3. 健康维持:均衡关注热量、蛋白质、纤维和维生素

最终数据附件4、附件5、附件6

六、模型说明

推荐系统架构:

  1. 第一阶段:协同过滤推荐(UPICF)
    • 基于用户行为数据计算用户相似度
    • 生成候选菜品推荐列表
    • 为每个用户生成个性化评分预测
  1. 第二阶段:多目标优化(MOPSO)
    • 基于用户健康目标和营养需求优化推荐
    • 使用粒子群优化算法生成最优餐食组合
    • 平衡营养均衡、用户偏好和多样性

整体详细说明流程图

UPICF协同过滤流程

1.2.1 初始化
  • 输入用户-菜品交互矩阵和用户特征数据
  • 初始化推荐器实例
1.2.2 相似度计算
  • 使用余弦相似度计算用户间相似性
  • 构建用户相似度矩阵
1.2.3 评分预测
  • 对于每个用户,找到最相似的K个用户
  • 基于相似用户的评分计算目标用户对未尝试菜品的预测评分
  • 使用加权平均方法,权重为用户相似度
1.2.4 推荐生成
  • 根据预测评分对菜品进行排序
  • 选择评分最高的N个菜品作为推荐结果

MOPSO多目标优化流程

1.3.1 初始化
  • 以UPICF推荐结果作为输入
  • 初始化粒子群优化器,设置粒子数量、迭代次数等参数
  • 获取用户特征和菜品特征数据
1.3.2 目标函数定义

包含四个优化目标:

  1. UPICF推荐分数:最大化协同过滤推荐的评分
  2. 营养均衡性:最小化实际摄入与理想营养比例的偏差
  3. 健康目标匹配度:根据用户健康目标(减重、增肌、维持等)匹配菜品
  4. 口味偏好匹配度:匹配用户的口味偏好(辣味、甜味、清淡等)
1.3.3 优化过程
  • 随机生成初始粒子群,每个粒子代表一种菜品组合方案
  • 迭代优化,更新粒子位置和速度
  • 计算每个粒子的适应度(目标函数值)
  • 跟踪个体最优解和全局最优解
  • 使用帕累托前沿选择非支配解
1.3.4 结果选择
  • 根据用户特征计算各目标的权重
  • 从帕累托最优解中选择加权得分最高的方案
  • 输出包含菜品、营养信息的详细推荐结果

七、模型评估

推荐系统评估结果总览

|-------------------|--------------|------------|------------|---------------------------------|
| 评估维度 | 具体指标 | 指标值 | 表现评价 | 核心问题与建议 |
| 1. 评分预测质量 | RMSE | 0.0027 | 极优秀 | 预测精度极高,但需警惕过拟合。 |
| | MAE | 0.0004 | 极优秀 | |
| | R² | 0.9997 | 极优秀 | |
| | 皮尔逊相关系数 | 0.9999 | 极优秀 | |
| 2. 系统覆盖率 | 覆盖率 | 0.0581 | 极差 | 推荐物品范围过窄,无法帮助用户发现更多内容。亟待改进。 |
| 3. 马太效应 | 所有物品基尼系数 | 0.1352 | 分布平等 | 系统有效避免了"富者愈富"效应,促进了公平性。 |
| | 推荐物品基尼系数 | 0.0000 | 绝对公平 | |
| | 差异 | -0.1352 | 效应良好 | |
| 4. Top-K 推荐质量 | Top-5 | Top-10 | Top-15 | Top-20 |
| | 精确率 | 1.0000 | 1.0000 | 1.0000 |
| | 召回率 | 0.0093 | 0.0186 | 0.0280 |
| | F1-Score | 0.0185 | 0.0366 | 0.0544 |
| | NDCG | 0.9999 | 0.9999 | 0.9999 |
| | 多样性 | 0.1275 | 0.1101 | 0.0828 |
| | 新颖性 | 0.0000 | 0.0000 | 0.0000 |


核心结论与行动建议摘要

|-------------|---------------------------------------|------------------------------------------------------|
| 维度 | 结论 | 高优先级行动 |
| 准确性 | 过度优化:预测和排序精度极高,但可能已过拟合,牺牲了其他重要指标。 | 1. 首要目标:提升覆盖率与召回率。引入长尾物品、调整算法策略(如降低推荐阈值,加入探索机制)。 |
| 覆盖率/召回率 | 严重短板:系统只触及了用户兴趣和物品库的冰山一角。 | 2. 核心优化:增强多样性与新颖性。在推荐目标中加入多样性约束,实施"探索-利用"平衡策略。 |
| 多样性/新颖性 | 严重不足:推荐结果同质化严重,无法带来探索的乐趣。 | 3. 模型复查:检查模型是否过拟合,确保其在更广的物品范围内仍能保持良好的泛化能力。 |
| 公平性 | 表现优异:系统推荐分布公平,无马太效应。 | |

八、系统功能实施

用户端(移动端Android APP)功能设计

1. 身份验证模块

负责用户账号的创建与安全校验,解决"用户如何合法进入系统"的问题,功能细节如下:

  • 注册:用户需按格式输入姓名、手机号、性别、密码(如密码长度≥6位),通过阿里云短信API获取4位验证码完成注册;信息格式不符(如手机号位数错误、两次密码不一致)时弹窗提示错误。

  • 登录:支持"手机号/用户名+密码"登录,输入错误(如密码错误、账号不存在)时提示具体原因;登录成功后记录"上一次登录时间"并跳转至系统首页。

  • 找回密码:通过注册手机号接收验证码,验证通过后可重置密码(需两次输入一致的新密码),重置成功后同步更新数据库并跳转登录页。

2. 信息管理模块

负责用户个人信息与行为记录的管理,为"口味偏好预测"与"营养规划"提供数据支撑,功能如下:

  • 个人信息管理
    • 查看:展示用户基础信息(姓名、性别、年龄、身高、体重、职业、身体活动水平(轻/中/重)、健康状况(无特殊疾病)、注册时间);
    • 修改:支持编辑身高、体重、职业、身体活动水平等信息,修改后实时同步至数据库(如将"轻活动水平"改为"中活动水平")。
  • 行为记录查询:(保留:我的喜欢)
    • 我的喜爱:展示用户收藏的高评分菜品,支持"取消收藏"操作,收藏状态实时同步至数据库。
3. 饮食推荐模块(核心功能)

是用户端核心模块,通过"口味偏好预测+营养均衡计算"解决"推荐什么菜""吃多少"的问题,分两大子功能:

(1)菜品推荐子功能(基于改进协同过滤UPICF)

核心逻辑为"通过用户历史评分预测潜在偏好,生成精准推荐列表",具体功能:

  • 用户口味偏好建模
    • 构建用户-菜品评分矩阵、菜品属性矩阵(含菜品的食材、口味、功效、烹饪方式等属性);
    • 基于TF-IDF思想计算用户对菜品属性的兴趣权重(如用户频繁评分"香辣"口味菜品,则"香辣"属性权重升高),引入时间权重函数(参考艾宾浩斯遗忘曲线)修正早期评分的影响(近期评分权重更高);
    • 填充稀疏矩阵:对用户未评分的菜品,按"菜品属性匹配度"计算填充值(如用户未评过分的"鱼香肉丝"与已评分的"宫保鸡丁"属性相似,则用"宫保鸡丁"评分均值填充)。
  • 用户相似度计算
    • 在传统修正余弦相似度基础上,引入用户影响因子 (修正用户评分差异的影响)、菜品影响因子(修正菜品本身质量的影响),计算目标用户的近邻用户集(取相似度最高的前K个用户,K最优值为70)。
  • 推荐列表生成
    • 基于近邻用户的评分,通过UPICF算法计算目标用户对未评分菜品的预测评分;
    • 排除用户近3日已食用的菜品,按预测评分降序生成TOP-N推荐列表(如TOP10),列表展示菜品名称、评分、收藏数、核心功效(如"减肥瘦身""降血压"),点击可查看详情。
  • 冷启动处理:若用户无历史评分(新用户),则默认推荐系统内"收藏量TOP10"的热门菜品,初步建立用户画像;用户产生评分后,自动切换为UPICF推荐逻辑。
(2)营养规划子功能(基于MOPSO算法)

核心逻辑为"根据用户营养需求,计算菜品中食材的适宜食用量",具体功能:

  • 用户营养需求确定
    • 根据用户年龄、性别、身体活动水平,查询《中国居民膳食营养素参考摄入量》,确定每餐(早/午/晚)的核心营养元素参考值------包含能量(千卡)、蛋白质(克)、脂肪(克)、碳水化合物(克)(如24岁女性轻活动水平,午餐能量参考值为720.57千卡,蛋白质27克、脂肪20克、碳水化合物108.1克);
    • 按"三餐能量摄入比例3:4:3"拆分每日营养需求(如每日需2000千卡,则早餐600千卡、午餐800千卡、晚餐600千卡)。
  • 食材食用量计算
    • 用户从推荐列表中选择菜品后,系统自动解析菜品所含核心食材(如"木耳炒肉"含黑木耳、猪肉,"西红柿炒蛋"含西红柿、鸡蛋);
    • 调用MOPSO算法,结合食材营养元素含量(来源于《中国食物成分表》,如100克猪肉含395千卡能量、13.2克蛋白质、37.0克脂肪),计算食材食用量,确保营养元素摄入量在"推荐膳食营养素摄入量(RNI)~可耐受最高摄入量(UL)"范围内;
    • 输出3套可选食用量方案,每套方案展示"食材名称、推荐量(克)、实际营养元素含量、与参考值的偏差率"(实验验证偏差率≤8%,符合健康标准)。
(3)混合推荐模型:
4. 菜品搜索模块

满足用户主动查找菜品的需求,提供高效检索功能,细节如下:

  • 模糊查询:用户输入菜品名称/食材关键词(如"芹菜""红烧肉"),系统通过正则表达式匹配结果,返回含关键词的所有菜品(如输入"芹菜",返回"芹菜鸡丝""芹菜炒香菇""虾米炒芹菜");
  • 快捷搜索
    • 热门搜索:展示近一周用户搜索量TOP8的词条(如"家常菜""牛肉""鸡蛋汤"),点击词条可快速填充搜索框并执行查询;
    • 近期搜索:按时间倒序展示用户历史搜索记录,支持"清空历史"操作;
  • 结果交互:搜索结果列表展示菜品名称、评分、核心食材,点击菜品可进入详情页(查看做法、功效、用户评价)。
5. 基础辅助模块

提供基础交互与信息展示功能,提升用户体验:

  • 营养知识展示:首页顶部设置轮播图,展示营养常识(如"蛋白质的主要来源""碳水化合物的作用"),点击图片可进入详情页查看完整内容;
  • 热门菜品列表 :首页展示近一周点击量TOP10的热门菜品,支持按"评分(从高到低)""收藏数(从多到少)"筛选排序,点击菜品可直接加入"待选菜品"用于营养规划。

管理员端(后台Web端)功能设计

面向系统管理员,核心目标是"数据管理+统计分析+反馈处理",基于Vue+SpringBoot+Mybatis实现,包含3大核心模块:

1. 数据统计模块

提供系统运行数据的可视化展示,辅助管理员掌握系统状态,功能如下:

  • 核心指标概览:首页展示实时统计数值,包括"总用户数""菜品总数""食材总数""昨日登录用户数";
  • 可视化分析
    • 饼图:展示"菜系分布"(如家常菜占比40.85%、川菜占比25%)、"用户性别分布"(如男性52%、女性48%)、"用户年龄段分布"(如40岁60%、41~60岁25%);
    • 柱状图:展示"菜品点赞热度TOP6""菜品历史评分TOP6",鼠标悬浮图表可查看具体数值(如"手撕包菜"评分94.0分、收藏17次)。
2. 数据管理模块

负责系统核心数据的增删改查,确保数据准确性与完整性,分3个子模块:

(1)用户信息管理
  • 数据查看:按分页展示所有用户的基础信息(用户ID、姓名、手机号、性别、年龄、身体活动水平、注册时间、上一次登录时间)与行为标签(如"常浏览家常菜""偏好清淡口味");
  • 操作功能
    • 添加用户:管理员可手动录入用户信息(如为社区特定人群创建账号),录入后同步至用户信息表;
    • 编辑用户:支持修改用户"身体活动水平""健康状况"等信息(如将"无疾病"改为"轻度高血压",但需备注修改原因);
    • 删除用户:支持单个/批量删除无效账号(如长期未登录(超过6个月)的账号),删除前需二次确认;
    • 模糊查询:通过"用户ID、姓名、手机号"关键词筛选用户,快速定位目标账号。
(2)菜品/食材信息管理
  • 菜品管理
    • 数据查看:展示菜品详情(菜品ID、名称、类别、功效、食材、烹饪方式、口味、制作方法、评分、收藏数、图片URL);
    • 操作功能:添加菜品(录入新菜品信息,上传图片并填写URL)、编辑菜品(修改口味、做法等内容,如将"微辣"改为"中辣")、删除菜品(清理数据缺失/低评分(≤30分)的菜品);支持按"菜系""评分""收藏数"筛选菜品。
  • 食材管理
    • 数据查看:展示食材营养数据(食材ID、名称、类别(如谷物类、豆类)、可食部分(%)、热量(千卡/100克)、蛋白质(克/100克)、脂肪(克/100克)、碳水化合物(克/100克));
    • 操作功能:添加食材(从《中国食物成分表》补充新食材,如"藜麦")、编辑食材(修正营养含量数据,如更新"黑豆"的蛋白质含量)、删除食材(清理无效/重复食材)。

九、存在问题

1.数据的使用性。

1采用了构建用户画像,调查问卷,提取用户对菜品的特征处理,但缺乏用户对菜品的真实使用数据,(如点击、收藏、评分)等相关具体的真实性数据,对系统真实使用性。------数据来源策略1

2.若采用用户对菜品的真实使用数据(模拟用户使用),则用户对菜品的稀疏度、冷启动存在弊端。------数据来源策略2

2.当前进度,已完成任务书、开题报告、毕业设计,进一步完善毕业论文、模型优化

十、附件资料

附件1:📎用户饮食偏好.xlsx

附件2:📎菜品.xlsx

附件3:用户数据增强📎enhanced_user_features_960.csv

附件4:用户数据增强📎enhanced_user_features_960.csv

附件5:菜品特征📎enhanced_dish_features.csv

附件6:用户-菜品交互📎user_dish_interaction.csv

项目地址:沐硕/Diet - 码云 - 开源中国

相关推荐
Z9fish2 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法
nglff2 小时前
蓝桥杯抱佛脚第一天|简单模拟,set,map的使用
算法·职场和发展·蓝桥杯
愣头不青2 小时前
560.和为k的子数组
java·数据结构
仟濹2 小时前
【算法打卡day27(2026-03-19 周四)】蓝桥云课中Lv.1难度中的绝大部分题
算法·蓝桥杯
乱世军军2 小时前
把 Python 3.13 降级到 3.11
开发语言·python
共享家95272 小时前
Java入门(String类)
java·开发语言
Y5neKO2 小时前
某国赛CTF逆向题目Writeup:re1
python·逆向·ctf
罗湖老棍子2 小时前
滑动窗口与双调队列:幕布覆盖问题(定右缩左满分板子)改编自LeetCode 1438
算法·滑动窗口·单调队列
l软件定制开发工作室2 小时前
Spring开发系列教程(34)——打包Spring Boot应用
java·spring boot·后端·spring·springboot