Goodjiahao 6 months ago
parent 10dcca7b6b
commit 260bb9c8c3

@ -1,194 +0,0 @@
from flask import Response,Flask,request
from methods import init_Food,init_Meal,to_Data, to_Json, get_Image,get_AllImage,get_Score
from personal_recommend import CF_Algorithm,user_test
from baidu import imageclassify
from cal_score import cal_score
#list = [1,3,7,9,28,38,43,15,42,14,22,30,46,51,53,58,68,69,72,75,85,86,87,88,89,90,91,96,97,99,98,101,102,103,106,108,110]
list = []
mealdata = [{'name': '土豆烧牛肉', 'list': [65, 65, 65, 14, 38], 'cata': 'lunch'},
{'name': '番茄炒蛋', 'list': [78, 78, 35, 35, 35, 35], 'cata': 'lunch'},
{'name': '麻婆豆腐', 'list': [4, 4, 4, 4, 19], 'cata': 'lunch'},
{'name': '宫保鸡丁', 'list': [8, 67, 67], 'cata': 'lunch'},
{'name': '糖醋排骨', 'list': [63, 63, 63, 63], 'cata': 'lunch'},
{'name': '酸辣土豆丝', 'list': [14, 14, 19], 'cata': 'lunch,vegetarian'},
{'name': '地三鲜', 'list': [14, 14, 18, 18, 19, 19], 'cata': 'lunch,vegetarian'},
{'name': '蛋炒饭', 'list': [78, 0], 'cata': 'lunch,dinner'},
{'name': '小笼包', 'list': [2, 63], 'cata': 'breakfast'},
{'name': '重庆小面', 'list': [2, 19], 'cata': 'breakfast,dinner,noodle'},
{'name': '全麦面包', 'list': [2], 'cata': 'breakfast,keep'},
{'name': '牛肉汉堡', 'list': [2, 65], 'cata': 'breakfast,dinner'},
{'name': '皮蛋瘦肉粥', 'list': [12, 63, 78], 'cata': 'breakfast'},
{'name': '水果燕麦粥', 'list': [12, 13, 57], 'cata': 'breakfast,keep,vegetarian'},
{'name': '意大利面', 'list': [2, 35], 'cata': 'breakfast,noodle'},
{'name': '水果沙拉', 'list': [57, 58, 59], 'cata': 'breakfast,dinner,keep,vegetarian'},
{'name': '香煎牛排', 'list': [65, 65], 'cata': 'dinner,keep'},
{'name': '炸酱面', 'list': [2, 43, 44], 'cata': 'dinner,noodle'},
{'name': '豚骨拉面', 'list': [2, 43, 20], 'cata': 'dinner,noodle'},
{'name': '柠檬鸡胸', 'list': [59, 67, 67], 'cata': 'dinner,keep'},
{'name': '白灼西兰花', 'list': [40, 40], 'cata': 'lunch,dinner,vegetarian'},
{'name': '开水白菜', 'list': [16, 16], 'cata': 'lunch,dinner,vegetarian'},
{'name': '凉拌萝卜丝', 'list': [30, 30], 'cata': 'lunch,dinner,vegetarian'},
{'name': '生煎金枪鱼', 'list': [70, 70, 70], 'cata': 'dinner,keep'},
{'name': '荞麦面', 'list': [1, 2, 3], 'cata': 'breakfast,dinner,noodle,keep'},
{'name': '薯条', 'list': [66,67], 'cata': 'snack'},
{'name': '冰激凌', 'list': [65,66], 'cata': 'snack'},
{'name': '巧克力', 'list': [65], 'cata': 'snack'},
{'name': '棒棒糖', 'list': [66], 'cata': 'snack'},
{'name': '威化饼干', 'list': [67,68], 'cata': 'snack'},
{'name': '双皮奶', 'list': [68], 'cata': 'snack'},
{'name': '牛肉干', 'list': [69], 'cata': 'snack'},
{'name': '炸鸡腿', 'list': [79], 'cata': 'snack'},
{'name': '三黄油鸡', 'list': [67, 25, 17], 'cata': 'lunch,dinner,shanghai'},
{'name': '丝瓜炒小鲜', 'list': [21, 24, 17], 'cata': 'breakfast,dinner,shanghai'},
{'name': '乳香四季豆', 'list': [37, 24, 77], 'cata': 'lunch,dinner,shanghai'},
{'name': '冰糟鳕鱼冻', 'list': [70, 59, 17], 'cata': 'lunch,dinner,shanghai'},
{'name': '凤吞花菇', 'list': [67, 24, 17], 'cata': 'lunch,dinner,shanghai'},
{'name': '凤尾明虾', 'list': [67, 75, 76], 'cata': 'lunch,dinner,shanghai'},
{'name': '沪式炒素虾仁', 'list': [75, 25, 17], 'cata': 'lunch,dinner,shanghai'}
]
app = Flask(__name__)
staticFood = init_Food()
staticMeal = init_Meal(staticFood,mealdata)
Meal = staticMeal
Meal = get_AllImage(staticMeal,list)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/meal', methods = ['POST']) # 返回分数
def get_meal():
data = to_Data()
meal = Meal
u = data['user']
print(u);
i = 0
food_score = cal_score(u); # 80种食物的评分列表存储有序
print(food_score)
for m in meal:
if(i>=80):
m['score'] = get_Score(m,u,meal)
else:
m['score'] = food_score[i]
i = i + 1
if 'snack' in m['cata']:
s=float(m['score'])/2
m['score']='%.1f' % s
print(meal);
data = to_Json(meal)
return data
@app.route('/score', methods = ['POST']) # 返回分数
def get_score():
data = to_Data()
meal = data['meal']
u = data['user']
all = data['all']
print(u);
i = 0
food_score = cal_score(u); # 80种食物的评分列表存储有序
print(food_score)
for m in meal:
if(i>=80):
m['score'] = get_Score(m,u,all)
else:
m['score'] = food_score[i]
i = i + 1
if 'snack' in m['cata']:
s=float(m['score'])/2
m['score']='%.1f' % s
data = to_Json(meal)
print(meal);
return data
@app.route('/searchImage', methods = ['POST'])
def search_Image():
data = to_Data()
name = data['name']
number = data['number']
print(number)
url = get_Image(name,number,False)
print(url)
data = to_Json(url)
return data
@app.route('/classifyImage', methods = ['POST'])
def clasiify_Image():
print('开始识别!')
data = request.files['image']
image = data.read()
result =imageclassify(image)
id = -1;
for i in range(len(staticFood)):
m = staticFood[i]['name']
if(m==result):
id=i
print('食材id',i)
break
data= to_Json(id)
return data
@app.route('/recommend', methods = ['POST'])
def recommend():
data = to_Data()
#area = data['area']
#user= data['user']
result = CF_Algorithm(user_test,'shanghai')
data = to_Json(result)
print('recommend!')
print(data)
return data
@app.route("/image/<imageid>")
def index(imageid):
try:
import os
# 安全的基础目录
base_dir = os.path.abspath('images')
# 输入验证:只允许字母、数字和下划线
import re
if not re.match(r'^[a-zA-Z0-9_]+$', imageid):
print("错误: 无效的图片ID格式")
return "无效的图片ID格式", 400
# 安全构建文件路径
file_path = os.path.join(base_dir, '{}.jpg'.format(imageid))
# 路径规范化
file_path = os.path.normpath(file_path)
# 验证路径是否在允许的目录范围内(防止路径遍历)
if not file_path.startswith(base_dir):
print("错误: 访问被拒绝 - 路径遍历尝试")
return "访问被拒绝", 403
print("尝试访问图片: {}".format(file_path))
# 检查文件是否存在
if os.path.exists(file_path):
# 打开图片文件
with open(file_path, 'rb') as f:
img_data = f.read()
resp = Response(img_data, mimetype="image/jpg")
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
else:
print("错误: 找不到图片文件 {}".format(file_path))
return "图片不存在", 404
except Exception as e:
print("处理图片请求时出错: {}".format(str(e)))
return "服务器内部错误", 500
if __name__ == '__main__':
app.run(host = '0.0.0.0',port = 5000)

@ -1,32 +0,0 @@
# -*- mode: python -*-
block_cipher = None
a = Analysis(['app.py'],
pathex=['D:\\Python\\iNu'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='app',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )

@ -1,30 +0,0 @@
# coding:utf-8
from aip import AipImageClassify
""" 这里输入你创建应用获得的三个参数"""
APP_ID = '16862212'
API_KEY = 'EZQG0mMgFiCb14v0KSUvLarS'
SECRET_KEY = 'O0ayDsTgdPXIdAr48Ost18dtf3bTc1PM'
client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def imageclassify(image):
#path='images/98.jpg'
#image = get_file_content(path)
r = client.advancedGeneral(image);
print(r);
result = r['result'][0]['keyword']
print(result)
return(result)
""" 调用通用物体识别 """
#imageclassify('')

@ -1,277 +0,0 @@
# 进行直接载入模型,然后给出该模型下对每种食材的评分
import lightgbm as lgb
import pandas as pd
def cal_score(u):#u是人的信息
unit = pd.read_csv("files/100unit.csv") # 每种食物100g的矩阵
# body = 读取人的身体数据然后开始分类。这里的body是一个字典类型
body = {'sex': 0,
'age': 22,
'gaoxueya': 0,
'tangniaobing': 0,
'HEIGHT': 168,
'WEIGHT': 58,
'YTB': 0.7,#这项没有用上,取一个正常值
'STJ': 14,#这项没有用上,取一个正常值
'SBW': 25#这项没有用上,取一个正常值
} # 一个默认的示例
body['sex'] = int(u['gender'])
body['age'] = 2019-int((u['birthday'].split('-'))[0])
body['HEIGHT'] = int(u['height'])+100
body['WEIGHT'] = int(u['weight'])
if(u['xieya'][0]+u['xieya'][1]>=230):
body['gaoxueya'] = 1
if(u['xietang']>=70):
body['tangniaobing'] = 1
### 读取模型
model_all = lgb.Booster(model_file='files/all.txt') # 总的所有人的数据训练的模型
model_age11 = lgb.Booster(model_file='files/age11-18.txt') # 按年龄分类
model_age19 = lgb.Booster(model_file='files/age19-28.txt')
model_age29 = lgb.Booster(model_file='files/age29-38.txt')
model_age39 = lgb.Booster(model_file='files/age39-48.txt')
model_age49 = lgb.Booster(model_file='files/age49-58.txt')
model_age59 = lgb.Booster(model_file='files/age59-68.txt')
model_age69 = lgb.Booster(model_file='files/age69-78.txt')
model_age79 = lgb.Booster(model_file='files/age79-100.txt')
model_gaoxueya0 = lgb.Booster(model_file='files/gaoxueya0.txt') # 按高血压情况
model_gaoxueya1 = lgb.Booster(model_file='files/gaoxueya1.txt')
model_tangniaobing0 = lgb.Booster(model_file='files/tangniaobing0.txt') # 按糖尿病情况
model_tangniaobing1 = lgb.Booster(model_file='files/tangniaobing1.txt')
model_sex1 = lgb.Booster(model_file='files/sex1.txt') # 按性别
model_sex2 = lgb.Booster(model_file='files/sex2.txt')
model_BMIFP = lgb.Booster(model_file='files/BMIFP.txt') # 按BMI-FP肥胖GZ过重PS偏瘦ZC正常
model_BMIGZ = lgb.Booster(model_file='files/BMIGZ.txt')
model_BMIPS = lgb.Booster(model_file='files/BMIPS.txt')
model_BMIZC = lgb.Booster(model_file='files/BMIZC.txt')
model_SBWBZC = lgb.Booster(model_file='files/SBWBZC.txt') # 按上臂围分类,正常与不正常
model_SBWZC = lgb.Booster(model_file='files/SBWZC.txt')
model_STJFP = lgb.Booster(model_file='files/STJFP.txt') # 按三角肌分类,有肥胖,消瘦,正常
model_STJXS = lgb.Booster(model_file='files/STJXS.txt')
model_STJZC = lgb.Booster(model_file='files/STJZC.txt')
model_YTBFP = lgb.Booster(model_file='files/YTBFP.txt') # 按腰臀比分类,肥胖和正常
model_YTBZC = lgb.Booster(model_file='files/YTBZC.txt')
food_score_all = model_all.predict(unit)
###开始给人分类,并且取得对应模型下的评分
# model_sex_score是基于性别的评分列表
if body['sex'] == 1: # 是男性
food_score_sex1 = model_sex1.predict(unit)
model_sex_score = food_score_sex1.tolist()
else:
food_score_sex2 = model_sex2.predict(unit)
model_sex_score = food_score_sex2.tolist()
if body['age'] <= 18:
food_score_age11 = model_age11.predict(unit)
model_age_score = food_score_age11.tolist()
elif body['age'] <= 28:
food_score_age19 = model_age19.predict(unit)
model_age_score = food_score_age19.tolist()
elif body['age'] <= 38:
food_score_age29 = model_age29.predict(unit)
model_age_score = food_score_age29.tolist()
elif body['age'] <= 48:
food_score_age39 = model_age39.predict(unit)
model_age_score = food_score_age39.tolist()
elif body['age'] <= 58:
food_score_age49 = model_age49.predict(unit)
model_age_score = food_score_age49.tolist()
elif body['age'] <= 68:
food_score_age59 = model_age59.predict(unit)
model_age_score = food_score_age59.tolist()
elif body['age'] <= 78:
food_score_age69 = model_age69.predict(unit)
model_age_score = food_score_age69.tolist()
else:
food_score_age79 = model_age79.predict(unit)
model_age_score = food_score_age79.tolist()
if body['gaoxueya'] == 1: # 有高血压
food_score_gaoxueya1 = model_gaoxueya1.predict(unit)
model_gaoxueya_score = food_score_gaoxueya1.tolist()
else:
food_score_gaoxueya0 = model_gaoxueya0.predict(unit)
model_gaoxueya_score = food_score_gaoxueya0.tolist()
if body['tangniaobing'] == 1: # 有糖尿病
food_score_tangniaobing1 = model_tangniaobing1.predict(unit)
model_tangniaobing_score = food_score_tangniaobing1.tolist()
else:
food_score_tangniaobing0 = model_tangniaobing0.predict(unit)
model_tangniaobing_score = food_score_tangniaobing0.tolist()
body['BMI'] = body['WEIGHT'] / body['HEIGHT'] / body['HEIGHT'] * 10000 # 通过身高体重计算BMI
if body['BMI'] <= 18.4:
food_score_BMIPS = model_BMIPS.predict(unit)
model_BMI_score = food_score_BMIPS.tolist()
elif body['BMI'] <= 23.9:
food_score_BMIZC = model_BMIZC.predict(unit)
model_BMI_score = food_score_BMIZC.tolist()
elif body['BMI'] <= 27.9:
food_score_BMIGZ = model_BMIGZ.predict(unit)
model_BMI_score = food_score_BMIGZ.tolist()
else:
food_score_BMIFP = model_BMIFP.predict(unit)
model_BMI_score = food_score_BMIFP.tolist()
if body['SBW'] <= 22.77 and body['sex'] == 1: # 上臂围不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
elif body['SBW'] <= 20.88 and body['sex'] == 2: # 不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_SBWZC = model_SBWZC.predict(unit)
model_SBW_score = food_score_SBWZC.tolist()
if body['YTB'] > 0.9 and body['sex'] == 1: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
elif body['YTB'] > 0.8 and body['sex'] == 2: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_YTBZC = model_YTBZC.predict(unit)
model_YTB_score = food_score_YTBZC.tolist()
if body['STJ'] > 15 and body['sex'] == 1: # 男 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] > 19.8 and body['sex'] == 2: # 女 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] < 10 and body['sex'] == 1: # 男 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
elif body['STJ'] < 13.2 and body['sex'] == 2: # 女 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_STJZC = model_STJZC.predict(unit)
model_STJ_score = food_score_STJZC.tolist()
total_score = [] # 预置一个列表,开始对各模型的分数进行加权求和
weight = (1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8,
1 / 8,) # 用一个元组来存各模型分数的权重,这里是均匀分布,分别是 sex age gaoxueya tangniaobing BMI SBW STJ YTB
for i in range(0, 193): # 这里可以选择是否将每个维度归一化,注意这样确实会导致食材总评分数发生变化进而排序不相同,第二个就是归一化了的
"""score_i = weight[0]*model_sex_score[i]+weight[1]*model_age_score[i]+weight[2]*model_gaoxueya_score[i]+weight[3]*model_tangniaobing_score[i]\
+weight[4]*model_BMI_score[i]+weight[5]*model_SBW_score[i]+weight[6]*model_STJ_score[i]+weight[7]*model_YTB_score[i]"""
score_i = weight[0] * (model_sex_score[i] - min(model_sex_score)) / (
max(model_sex_score) - min(model_sex_score)) * 100 \
+ weight[1] * (model_age_score[i] - min(model_age_score)) / (
max(model_age_score) - min(model_age_score)) * 100 \
+ weight[2] * (model_gaoxueya_score[i] - min(model_gaoxueya_score)) / (
max(model_gaoxueya_score) - min(model_gaoxueya_score)) * 100 \
+ weight[3] * (model_tangniaobing_score[i] - min(model_tangniaobing_score)) / (
max(model_tangniaobing_score) - min(model_tangniaobing_score)) * 100 \
+ weight[4] * (model_BMI_score[i] - min(model_BMI_score)) / (
max(model_BMI_score) - min(model_BMI_score)) * 100 \
+ weight[5] * (model_SBW_score[i] - min(model_SBW_score)) / (
max(model_SBW_score) - min(model_SBW_score)) * 100 \
+ weight[6] * (model_STJ_score[i] - min(model_STJ_score)) / (
max(model_STJ_score) - min(model_STJ_score)) * 100 \
+ weight[7] * (model_YTB_score[i] - min(model_YTB_score)) / (
max(model_YTB_score) - min(model_YTB_score)) * 100
total_score.append(score_i)
# 接下来处理相同评分的食材,评分相同时,更小的食材代码优先
for i in range(0, 193):
total_score[i] = total_score[i] - i * 0.000000000001
# 食物列表
food_list = [111, 112, 113, 114, 115, 120, 121, 122, 123, 124, 131, 132, 141, 142,
151, 152, 190, 192, 211, 212, 213, 221, 222, 311, 312, 313, 314, 315, 321, 322,
331, 332, 341, 351, 352, 391, 392, 393, 411, 412, 413, 414, 421, 422, 431, 432,
441, 442, 443, 444, 445, 451, 452, 453, 454, 460, 471, 472, 473, 480, 510, 520,
611, 612, 613, 619, 621, 622, 623, 629, 631, 632, 633, 639, 641, 642, 643, 650,
661, 662, 710, 720, 811, 812, 813, 814, 821, 822, 823, 831, 832, 833, 841, 842,
843, 890, 911, 912, 913, 921, 922, 923, 931, 932, 933, 942, 943, 990, 1011, 1012,
1013, 1021, 1022, 1030, 1040, 1050, 1090, 1111, 1112, 1121, 1122, 1131, 1141,
1211, 1212, 1213, 1214, 1221, 1222, 1223, 1230, 1241, 1242, 1243, 1290, 1293,
1310, 1311, 1312, 1313, 1330, 1410, 1419, 1421, 1422, 1423, 1510, 1521, 1522,
1523, 1524, 1525, 1530, 1531, 1532, 1533, 1534, 1610, 1619, 1620, 1640, 1650,
1661, 1662, 1670, 1680, 1690, 1711, 1712, 1713, 1721, 1810, 1820, 1821, 1822,
1823, 1824, 1830, 1840, 1910, 1920, 2010, 2020, 2031, 2032, 2040, 2050, 2060,
2071, 2072, 2074, 2110, 2190] # 食物代码列表
dictfood = {111: '五谷香', 112: '小麦粉', 113: '', 114: '饼、馒头', 115: '面筋', 120: '稻米',
121: '粳米', 122: '籼米', 123: '糯米', 124: '米饭', 131: '玉米', 132: '玉米笋', 141: '大麦',
142: '青稞', 151: '小米', 152: '大黄米', 190: '高粱米', 192: '荞麦', 211: '土豆', 212: '甘薯',
213: '木薯', 221: '淀粉', 222: '粉丝', 311: '大豆', 312: '豆粉', 313: '豆腐', 314: '豆浆',
315: '豆腐干', 321: '绿豆', 322: '绿豆饼', 331: '红豆', 332: '豆沙', 341: '花豆', 351: '蚕豆',
352: '烤蚕豆', 391: '扁豆', 392: '豇豆', 393: '豌豆', 411: '萝卜', 412: '胡萝卜', 413: '大头菜',
414: '甜菜根', 421: '鲜豆', 422: '豆芽', 431: '茄子番茄辣椒', 432: '冬瓜黄瓜苦瓜南瓜等瓜类',
441: '大蒜', 442: '大葱', 443: '洋葱', 444: '韭菜', 445: '山蒜', 451: '大白菜', 452: '菜花',
453: '菠菜等蔬菜', 454: '竹笋', 460: '水生蔬菜', 471: '山药', 472: '芋头', 473: '', 480: '野生蔬菜',
510: '蘑菇', 520: '海带', 611: '苹果', 612: '', 613: '红果', 619: '海棠果', 621: '',
622: '李子', 623: '', 629: '酸枣', 631: '葡萄', 632: '石榴', 633: '', 639: '桑葚',
641: '', 642: '柑橘', 643: '', 650: '热带水果', 661: '哈密瓜', 662: '西瓜', 710: '坚果',
720: '花生瓜子', 811: '猪肉', 812: '猪杂', 813: '腊肉', 814: '香肠', 821: '牛肉', 822: '牛杂',
823: '牛肉干', 831: '羊肉', 832: '羊杂', 833: '羊肉串', 841: '驴肉', 842: '驴鞭', 843: '卤驴肉',
890: '狗肉兔肉', 911: '', 912: '鸡杂', 913: '烤鸡', 921: '', 922: '鸭杂', 923: '烤鸭',
931: '', 932: '鹅杂', 933: '烧鹅', 942: '火鸡杂', 943: '代码943的食物', 990: '鸽子', 1011: '牛奶',
1012: '羊奶', 1013: '人奶', 1021: '牛奶粉', 1022: '羊奶粉', 1030: '酸奶', 1040: '奶酪', 1050: '奶油',
1090: '其他乳制品', 1111: '鸡蛋', 1112: '松花蛋', 1121: '鸭蛋', 1122: '咸鸭蛋', 1131: '鹅蛋', 1141: '鹌鹑蛋',
1211: '', 1212: '黄鱼', 1213: '鱼油', 1214: '代码1214的食物', 1221: '', 1222: '虾米', 1223: '代码1223的食材',
1230: '螃蟹', 1241: '鲍鱼扇贝', 1242: '蛤蜊', 1243: '', 1290: '墨鱼鱿鱼', 1293: '代码1293的食物', 1310: '母乳化奶粉',
1311: '代码1311的食材', 1312: '代码1312的食材', 1313: '代码1313的食材', 1330: '婴幼儿补充食品', 1410: '小吃', 1419: '代码1419的食材',
1421: '蛋糕',
1422: '月饼', 1423: '蛋黄酥', 1510: '代码1510的食材 ', 1521: '麦片', 1522: '方便面', 1523: '面包', 1524: '饼干',
1525: '代码1525的食材', 1530: '薯片', 1531: '代码1531的食材', 1532: '代码1532的食材', 1533: '代码1533的食材', 1534: '代码1534的食材',
1610: '可乐',
1619: '代码1619的食材', 1620: '果汁', 1640: '果味奶', 1650: '植物蛋白饮料', 1661: '', 1662: '茶水', 1670: '固体饮料',
1680: '冰淇淋', 1690: '红景天饮料', 1711: '啤酒', 1712: '葡萄酒', 1713: '黄酒', 1721: '白酒', 1810: '',
1820: '糖果', 1821: '代码1821的食材', 1822: '代码1822的食材', 1823: '代码1823的食材', 1824: '代码1824的食材', 1830: '果脯',
1840: '代码1840的食物',
1910: '动物油', 1920: '植物油', 2010: '酱油', 2020: '', 2031: '豆瓣酱', 2032: '果酱', 2040: '腐乳',
2050: '咸菜', 2060: '香辛料', 2071: '', 2072: '味精', 2074: '代码2074的食材', 2110: '代码2110的食材', 2190: '代码2190的食材'}
# for score in sorted(total_score, reverse=True): # 降序排列
# print(score)#得到食材评分
# print(total_score.index(score))#得到排序后的分数的下标
# print(food_list[total_score.index(score)])#得到该下标对应的食材代码
# print(dictfood[food_list[total_score.index(score)]]) # 得到食材代码对应的食材
# print("--------------")
zq_food = ['大米', '小米', '小麦', '玉米', '黄豆', '绿豆', '山药', '莲子', '花生', '核桃', '芝麻', '红薯', '燕麦', '薏米', '土豆',
'冬瓜', '白菜', '木耳', '茄子', '青椒', '西葫芦', '丝瓜', '南瓜', '苦瓜', '黄瓜', '百合', '竹笋', '芹菜', '洋葱', '菠菜',
'萝卜', '莲藕', '豆芽', '莴笋', '空心菜', '西红柿', '黄花菜', '四季豆', '胡萝卜', '韭菜', '茭白', '芋头', '香菜', '大蒜',
'大葱', '生姜', '苹果', '梨子', '桃子', '李子', '柿子', '橘子', '葡萄', '香蕉', '大枣', '芒果', '西瓜', '草莓', '菠萝',
'柠檬', '哈蜜瓜', '猕猴桃', '木瓜', '猪肉', '猪肝', '牛肉', '羊肉', '鸡肉', '鸭肉', '鲤鱼', '鲫鱼', '鲍鱼', '黄鳝', '',
'', '', '海带', '牛奶', '鸡蛋', '蜂蜜']
zq_food_code = [120, 151, 112, 131, 311, 321, 471, 720, 720, 710, 720, 212, 1521, 190, 211, 432, 451, 510, 431, 431,
432, 432, 432, 432, 432,
454, 454, 453, 443, 453, 411, 460, 422, 453, 453, 431, 454, 421, 412, 444, 460, 472, 453, 441, 442, 473,
611, 612, 621, 622,
633, 641, 631, 650, 623, 650, 662, 639, 650, 643, 661, 639, 650, 811, 812, 821, 831, 911, 921, 1211,
1211, 1241, 1211, 1242,
1230, 1221, 520, 1011, 1111, 1810]
# print(food_list.index(zq_food_code[0]))#这是获得一个食材代码在我原始列表中的下标,用此下标可以获得评分
zq_score = []
for zq_food_code_elem in zq_food_code:
zq_score.append(total_score[food_list.index(zq_food_code_elem)]) # 获得梓强的食材的评分是一个有序列表对应着excel表的序
for i in range(0, 80): # 处理重码,使评分与下标是一一对应的关系
zq_score[i] = (zq_score[i] - i * 0.000000000001 )/ 10
#print(i,"--",zq_score[i])
#for score in sorted(zq_score, reverse=True): # 降序排列
# print(zq_food[zq_score.index(score)],end=":")
#print(score)
# print(10*(score-min(zq_score))/(max(zq_score)-min(zq_score)))#归一化为0到10分
#pass
# print(score)#得到食材评分
# print(zq_score.index(score))#得到排序后的分数的下标
for i in range(0, 80): # 评分归一化
zq_score[i] = 10*(zq_score[i]-min(zq_score))/(max(zq_score)-min(zq_score))
for i in range(0, 80): # 评分归一化
zq_score[i] = '%.1f' %zq_score[i]
return zq_score

@ -1,277 +0,0 @@
# 进行直接载入模型,然后给出该模型下对每种食材的评分
import lightgbm as lgb
import pandas as pd
def cal_score(u):#u是人的信息
unit = pd.read_csv("files/100unit.csv") # 每种食物100g的矩阵
# body = 读取人的身体数据然后开始分类。这里的body是一个字典类型
body = {'sex': 0,
'age': 22,
'gaoxueya': 0,
'tangniaobing': 0,
'HEIGHT': 168,
'WEIGHT': 58,
'YTB': 0.7,#这项没有用上,取一个正常值
'STJ': 14,#这项没有用上,取一个正常值
'SBW': 25#这项没有用上,取一个正常值
} # 一个默认的示例
body['sex'] = int(u['gender'])
body['age'] = 2019-int((u['birthday'].split('-'))[0])
body['HEIGHT'] = int(u['height'])+100
body['WEIGHT'] = int(u['weight'])
if(u['xieya'][0]+u['xieya'][1]>=230):
body['gaoxueya'] = 1
if(u['xietang']>=70):
body['tangniaobing'] = 1
### 读取模型
model_all = lgb.Booster(model_file='files/all.txt') # 总的所有人的数据训练的模型
model_age11 = lgb.Booster(model_file='files/age11-18.txt') # 按年龄分类
model_age19 = lgb.Booster(model_file='files/age19-28.txt')
model_age29 = lgb.Booster(model_file='files/age29-38.txt')
model_age39 = lgb.Booster(model_file='files/age39-48.txt')
model_age49 = lgb.Booster(model_file='files/age49-58.txt')
model_age59 = lgb.Booster(model_file='files/age59-68.txt')
model_age69 = lgb.Booster(model_file='files/age69-78.txt')
model_age79 = lgb.Booster(model_file='files/age79-100.txt')
model_gaoxueya0 = lgb.Booster(model_file='files/gaoxueya0.txt') # 按高血压情况
model_gaoxueya1 = lgb.Booster(model_file='files/gaoxueya1.txt')
model_tangniaobing0 = lgb.Booster(model_file='files/tangniaobing0.txt') # 按糖尿病情况
model_tangniaobing1 = lgb.Booster(model_file='files/tangniaobing1.txt')
model_sex1 = lgb.Booster(model_file='files/sex1.txt') # 按性别
model_sex2 = lgb.Booster(model_file='files/sex2.txt')
model_BMIFP = lgb.Booster(model_file='files/BMIFP.txt') # 按BMI-FP肥胖GZ过重PS偏瘦ZC正常
model_BMIGZ = lgb.Booster(model_file='files/BMIGZ.txt')
model_BMIPS = lgb.Booster(model_file='files/BMIPS.txt')
model_BMIZC = lgb.Booster(model_file='files/BMIZC.txt')
model_SBWBZC = lgb.Booster(model_file='files/SBWBZC.txt') # 按上臂围分类,正常与不正常
model_SBWZC = lgb.Booster(model_file='files/SBWZC.txt')
model_STJFP = lgb.Booster(model_file='files/STJFP.txt') # 按三角肌分类,有肥胖,消瘦,正常
model_STJXS = lgb.Booster(model_file='files/STJXS.txt')
model_STJZC = lgb.Booster(model_file='files/STJZC.txt')
model_YTBFP = lgb.Booster(model_file='files/YTBFP.txt') # 按腰臀比分类,肥胖和正常
model_YTBZC = lgb.Booster(model_file='files/YTBZC.txt')
food_score_all = model_all.predict(unit)
###开始给人分类,并且取得对应模型下的评分
# model_sex_score是基于性别的评分列表
if body['sex'] == 1: # 是男性
food_score_sex1 = model_sex1.predict(unit)
model_sex_score = food_score_sex1.tolist()
else:
food_score_sex2 = model_sex2.predict(unit)
model_sex_score = food_score_sex2.tolist()
if body['age'] <= 18:
food_score_age11 = model_age11.predict(unit)
model_age_score = food_score_age11.tolist()
elif body['age'] <= 28:
food_score_age19 = model_age19.predict(unit)
model_age_score = food_score_age19.tolist()
elif body['age'] <= 38:
food_score_age29 = model_age29.predict(unit)
model_age_score = food_score_age29.tolist()
elif body['age'] <= 48:
food_score_age39 = model_age39.predict(unit)
model_age_score = food_score_age39.tolist()
elif body['age'] <= 58:
food_score_age49 = model_age49.predict(unit)
model_age_score = food_score_age49.tolist()
elif body['age'] <= 68:
food_score_age59 = model_age59.predict(unit)
model_age_score = food_score_age59.tolist()
elif body['age'] <= 78:
food_score_age69 = model_age69.predict(unit)
model_age_score = food_score_age69.tolist()
else:
food_score_age79 = model_age79.predict(unit)
model_age_score = food_score_age79.tolist()
if body['gaoxueya'] == 1: # 有高血压
food_score_gaoxueya1 = model_gaoxueya1.predict(unit)
model_gaoxueya_score = food_score_gaoxueya1.tolist()
else:
food_score_gaoxueya0 = model_gaoxueya0.predict(unit)
model_gaoxueya_score = food_score_gaoxueya0.tolist()
if body['tangniaobing'] == 1: # 有糖尿病
food_score_tangniaobing1 = model_tangniaobing1.predict(unit)
model_tangniaobing_score = food_score_tangniaobing1.tolist()
else:
food_score_tangniaobing0 = model_tangniaobing0.predict(unit)
model_tangniaobing_score = food_score_tangniaobing0.tolist()
body['BMI'] = body['WEIGHT'] / body['HEIGHT'] / body['HEIGHT'] * 10000 # 通过身高体重计算BMI
if body['BMI'] <= 18.4:
food_score_BMIPS = model_BMIPS.predict(unit)
model_BMI_score = food_score_BMIPS.tolist()
elif body['BMI'] <= 23.9:
food_score_BMIZC = model_BMIZC.predict(unit)
model_BMI_score = food_score_BMIZC.tolist()
elif body['BMI'] <= 27.9:
food_score_BMIGZ = model_BMIGZ.predict(unit)
model_BMI_score = food_score_BMIGZ.tolist()
else:
food_score_BMIFP = model_BMIFP.predict(unit)
model_BMI_score = food_score_BMIFP.tolist()
if body['SBW'] <= 22.77 and body['sex'] == 1: # 上臂围不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
elif body['SBW'] <= 20.88 and body['sex'] == 2: # 不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_SBWZC = model_SBWZC.predict(unit)
model_SBW_score = food_score_SBWZC.tolist()
if body['YTB'] > 0.9 and body['sex'] == 1: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
elif body['YTB'] > 0.8 and body['sex'] == 2: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_YTBZC = model_YTBZC.predict(unit)
model_YTB_score = food_score_YTBZC.tolist()
if body['STJ'] > 15 and body['sex'] == 1: # 男 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] > 19.8 and body['sex'] == 2: # 女 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] < 10 and body['sex'] == 1: # 男 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
elif body['STJ'] < 13.2 and body['sex'] == 2: # 女 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_STJZC = model_STJZC.predict(unit)
model_STJ_score = food_score_STJZC.tolist()
total_score = [] # 预置一个列表,开始对各模型的分数进行加权求和
weight = (1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8,
1 / 8,) # 用一个元组来存各模型分数的权重,这里是均匀分布,分别是 sex age gaoxueya tangniaobing BMI SBW STJ YTB
for i in range(0, 193): # 这里可以选择是否将每个维度归一化,注意这样确实会导致食材总评分数发生变化进而排序不相同,第二个就是归一化了的
"""score_i = weight[0]*model_sex_score[i]+weight[1]*model_age_score[i]+weight[2]*model_gaoxueya_score[i]+weight[3]*model_tangniaobing_score[i]\
+weight[4]*model_BMI_score[i]+weight[5]*model_SBW_score[i]+weight[6]*model_STJ_score[i]+weight[7]*model_YTB_score[i]"""
score_i = weight[0] * (model_sex_score[i] - min(model_sex_score)) / (
max(model_sex_score) - min(model_sex_score)) * 100 \
+ weight[1] * (model_age_score[i] - min(model_age_score)) / (
max(model_age_score) - min(model_age_score)) * 100 \
+ weight[2] * (model_gaoxueya_score[i] - min(model_gaoxueya_score)) / (
max(model_gaoxueya_score) - min(model_gaoxueya_score)) * 100 \
+ weight[3] * (model_tangniaobing_score[i] - min(model_tangniaobing_score)) / (
max(model_tangniaobing_score) - min(model_tangniaobing_score)) * 100 \
+ weight[4] * (model_BMI_score[i] - min(model_BMI_score)) / (
max(model_BMI_score) - min(model_BMI_score)) * 100 \
+ weight[5] * (model_SBW_score[i] - min(model_SBW_score)) / (
max(model_SBW_score) - min(model_SBW_score)) * 100 \
+ weight[6] * (model_STJ_score[i] - min(model_STJ_score)) / (
max(model_STJ_score) - min(model_STJ_score)) * 100 \
+ weight[7] * (model_YTB_score[i] - min(model_YTB_score)) / (
max(model_YTB_score) - min(model_YTB_score)) * 100
total_score.append(score_i)
# 接下来处理相同评分的食材,评分相同时,更小的食材代码优先
for i in range(0, 193):
total_score[i] = total_score[i] - i * 0.000000000001
# 食物列表
food_list = [111, 112, 113, 114, 115, 120, 121, 122, 123, 124, 131, 132, 141, 142,
151, 152, 190, 192, 211, 212, 213, 221, 222, 311, 312, 313, 314, 315, 321, 322,
331, 332, 341, 351, 352, 391, 392, 393, 411, 412, 413, 414, 421, 422, 431, 432,
441, 442, 443, 444, 445, 451, 452, 453, 454, 460, 471, 472, 473, 480, 510, 520,
611, 612, 613, 619, 621, 622, 623, 629, 631, 632, 633, 639, 641, 642, 643, 650,
661, 662, 710, 720, 811, 812, 813, 814, 821, 822, 823, 831, 832, 833, 841, 842,
843, 890, 911, 912, 913, 921, 922, 923, 931, 932, 933, 942, 943, 990, 1011, 1012,
1013, 1021, 1022, 1030, 1040, 1050, 1090, 1111, 1112, 1121, 1122, 1131, 1141,
1211, 1212, 1213, 1214, 1221, 1222, 1223, 1230, 1241, 1242, 1243, 1290, 1293,
1310, 1311, 1312, 1313, 1330, 1410, 1419, 1421, 1422, 1423, 1510, 1521, 1522,
1523, 1524, 1525, 1530, 1531, 1532, 1533, 1534, 1610, 1619, 1620, 1640, 1650,
1661, 1662, 1670, 1680, 1690, 1711, 1712, 1713, 1721, 1810, 1820, 1821, 1822,
1823, 1824, 1830, 1840, 1910, 1920, 2010, 2020, 2031, 2032, 2040, 2050, 2060,
2071, 2072, 2074, 2110, 2190] # 食物代码列表
dictfood = {111: '五谷香', 112: '小麦粉', 113: '', 114: '饼、馒头', 115: '面筋', 120: '稻米',
121: '粳米', 122: '籼米', 123: '糯米', 124: '米饭', 131: '玉米', 132: '玉米笋', 141: '大麦',
142: '青稞', 151: '小米', 152: '大黄米', 190: '高粱米', 192: '荞麦', 211: '土豆', 212: '甘薯',
213: '木薯', 221: '淀粉', 222: '粉丝', 311: '大豆', 312: '豆粉', 313: '豆腐', 314: '豆浆',
315: '豆腐干', 321: '绿豆', 322: '绿豆饼', 331: '红豆', 332: '豆沙', 341: '花豆', 351: '蚕豆',
352: '烤蚕豆', 391: '扁豆', 392: '豇豆', 393: '豌豆', 411: '萝卜', 412: '胡萝卜', 413: '大头菜',
414: '甜菜根', 421: '鲜豆', 422: '豆芽', 431: '茄子番茄辣椒', 432: '冬瓜黄瓜苦瓜南瓜等瓜类',
441: '大蒜', 442: '大葱', 443: '洋葱', 444: '韭菜', 445: '山蒜', 451: '大白菜', 452: '菜花',
453: '菠菜等蔬菜', 454: '竹笋', 460: '水生蔬菜', 471: '山药', 472: '芋头', 473: '', 480: '野生蔬菜',
510: '蘑菇', 520: '海带', 611: '苹果', 612: '', 613: '红果', 619: '海棠果', 621: '',
622: '李子', 623: '', 629: '酸枣', 631: '葡萄', 632: '石榴', 633: '', 639: '桑葚',
641: '', 642: '柑橘', 643: '', 650: '热带水果', 661: '哈密瓜', 662: '西瓜', 710: '坚果',
720: '花生瓜子', 811: '猪肉', 812: '猪杂', 813: '腊肉', 814: '香肠', 821: '牛肉', 822: '牛杂',
823: '牛肉干', 831: '羊肉', 832: '羊杂', 833: '羊肉串', 841: '驴肉', 842: '驴鞭', 843: '卤驴肉',
890: '狗肉兔肉', 911: '', 912: '鸡杂', 913: '烤鸡', 921: '', 922: '鸭杂', 923: '烤鸭',
931: '', 932: '鹅杂', 933: '烧鹅', 942: '火鸡杂', 943: '代码943的食物', 990: '鸽子', 1011: '牛奶',
1012: '羊奶', 1013: '人奶', 1021: '牛奶粉', 1022: '羊奶粉', 1030: '酸奶', 1040: '奶酪', 1050: '奶油',
1090: '其他乳制品', 1111: '鸡蛋', 1112: '松花蛋', 1121: '鸭蛋', 1122: '咸鸭蛋', 1131: '鹅蛋', 1141: '鹌鹑蛋',
1211: '', 1212: '黄鱼', 1213: '鱼油', 1214: '代码1214的食物', 1221: '', 1222: '虾米', 1223: '代码1223的食材',
1230: '螃蟹', 1241: '鲍鱼扇贝', 1242: '蛤蜊', 1243: '', 1290: '墨鱼鱿鱼', 1293: '代码1293的食物', 1310: '母乳化奶粉',
1311: '代码1311的食材', 1312: '代码1312的食材', 1313: '代码1313的食材', 1330: '婴幼儿补充食品', 1410: '小吃', 1419: '代码1419的食材',
1421: '蛋糕',
1422: '月饼', 1423: '蛋黄酥', 1510: '代码1510的食材 ', 1521: '麦片', 1522: '方便面', 1523: '面包', 1524: '饼干',
1525: '代码1525的食材', 1530: '薯片', 1531: '代码1531的食材', 1532: '代码1532的食材', 1533: '代码1533的食材', 1534: '代码1534的食材',
1610: '可乐',
1619: '代码1619的食材', 1620: '果汁', 1640: '果味奶', 1650: '植物蛋白饮料', 1661: '', 1662: '茶水', 1670: '固体饮料',
1680: '冰淇淋', 1690: '红景天饮料', 1711: '啤酒', 1712: '葡萄酒', 1713: '黄酒', 1721: '白酒', 1810: '',
1820: '糖果', 1821: '代码1821的食材', 1822: '代码1822的食材', 1823: '代码1823的食材', 1824: '代码1824的食材', 1830: '果脯',
1840: '代码1840的食物',
1910: '动物油', 1920: '植物油', 2010: '酱油', 2020: '', 2031: '豆瓣酱', 2032: '果酱', 2040: '腐乳',
2050: '咸菜', 2060: '香辛料', 2071: '', 2072: '味精', 2074: '代码2074的食材', 2110: '代码2110的食材', 2190: '代码2190的食材'}
# for score in sorted(total_score, reverse=True): # 降序排列
# print(score)#得到食材评分
# print(total_score.index(score))#得到排序后的分数的下标
# print(food_list[total_score.index(score)])#得到该下标对应的食材代码
# print(dictfood[food_list[total_score.index(score)]]) # 得到食材代码对应的食材
# print("--------------")
zq_food = ['大米', '小米', '小麦', '玉米', '黄豆', '绿豆', '山药', '莲子', '花生', '核桃', '芝麻', '红薯', '燕麦', '薏米', '土豆',
'冬瓜', '白菜', '木耳', '茄子', '青椒', '西葫芦', '丝瓜', '南瓜', '苦瓜', '黄瓜', '百合', '竹笋', '芹菜', '洋葱', '菠菜',
'萝卜', '莲藕', '豆芽', '莴笋', '空心菜', '西红柿', '黄花菜', '四季豆', '胡萝卜', '韭菜', '茭白', '芋头', '香菜', '大蒜',
'大葱', '生姜', '苹果', '梨子', '桃子', '李子', '柿子', '橘子', '葡萄', '香蕉', '大枣', '芒果', '西瓜', '草莓', '菠萝',
'柠檬', '哈蜜瓜', '猕猴桃', '木瓜', '猪肉', '猪肝', '牛肉', '羊肉', '鸡肉', '鸭肉', '鲤鱼', '鲫鱼', '鲍鱼', '黄鳝', '',
'', '', '海带', '牛奶', '鸡蛋', '蜂蜜']
zq_food_code = [120, 151, 112, 131, 311, 321, 471, 720, 720, 710, 720, 212, 1521, 190, 211, 432, 451, 510, 431, 431,
432, 432, 432, 432, 432,
454, 454, 453, 443, 453, 411, 460, 422, 453, 453, 431, 454, 421, 412, 444, 460, 472, 453, 441, 442, 473,
611, 612, 621, 622,
633, 641, 631, 650, 623, 650, 662, 639, 650, 643, 661, 639, 650, 811, 812, 821, 831, 911, 921, 1211,
1211, 1241, 1211, 1242,
1230, 1221, 520, 1011, 1111, 1810]
# print(food_list.index(zq_food_code[0]))#这是获得一个食材代码在我原始列表中的下标,用此下标可以获得评分
zq_score = []
for zq_food_code_elem in zq_food_code:
zq_score.append(total_score[food_list.index(zq_food_code_elem)]) # 获得梓强的食材的评分是一个有序列表对应着excel表的序
for i in range(0, 80): # 处理重码,使评分与下标是一一对应的关系
zq_score[i] = (zq_score[i] - i * 0.000000000001 )/ 10
#print(i,"--",zq_score[i])
#for score in sorted(zq_score, reverse=True): # 降序排列
# print(zq_food[zq_score.index(score)],end=":")
#print(score)
# print(10*(score-min(zq_score))/(max(zq_score)-min(zq_score)))#归一化为0到10分
#pass
# print(score)#得到食材评分
# print(zq_score.index(score))#得到排序后的分数的下标
for i in range(0, 80): # 评分归一化
zq_score[i] = 10*(zq_score[i]-min(zq_score))/(max(zq_score)-min(zq_score))
for i in range(0, 80): # 评分归一化
zq_score[i] = '%.1f' %zq_score[i]
return zq_score

@ -1,277 +0,0 @@
# 进行直接载入模型,然后给出该模型下对每种食材的评分
import lightgbm as lgb
import pandas as pd
def cal_score(u):#u是人的信息
unit = pd.read_csv("files/100unit.csv") # 每种食物100g的矩阵
# body = 读取人的身体数据然后开始分类。这里的body是一个字典类型
body = {'sex': 0,
'age': 22,
'gaoxueya': 0,
'tangniaobing': 0,
'HEIGHT': 168,
'WEIGHT': 58,
'YTB': 0.7,#这项没有用上,取一个正常值
'STJ': 14,#这项没有用上,取一个正常值
'SBW': 25#这项没有用上,取一个正常值
} # 一个默认的示例
body['sex'] = int(u['gender'])
body['age'] = 2019-int((u['birthday'].split('-'))[0])
body['HEIGHT'] = int(u['height'])+100
body['WEIGHT'] = int(u['weight'])
if(u['xieya'][0]+u['xieya'][1]>=230):
body['gaoxueya'] = 1
if(u['xietang']>=70):
body['tangniaobing'] = 1
### 读取模型
model_all = lgb.Booster(model_file='files/all.txt') # 总的所有人的数据训练的模型
model_age11 = lgb.Booster(model_file='files/age11-18.txt') # 按年龄分类
model_age19 = lgb.Booster(model_file='files/age19-28.txt')
model_age29 = lgb.Booster(model_file='files/age29-38.txt')
model_age39 = lgb.Booster(model_file='files/age39-48.txt')
model_age49 = lgb.Booster(model_file='files/age49-58.txt')
model_age59 = lgb.Booster(model_file='files/age59-68.txt')
model_age69 = lgb.Booster(model_file='files/age69-78.txt')
model_age79 = lgb.Booster(model_file='files/age79-100.txt')
model_gaoxueya0 = lgb.Booster(model_file='files/gaoxueya0.txt') # 按高血压情况
model_gaoxueya1 = lgb.Booster(model_file='files/gaoxueya1.txt')
model_tangniaobing0 = lgb.Booster(model_file='files/tangniaobing0.txt') # 按糖尿病情况
model_tangniaobing1 = lgb.Booster(model_file='files/tangniaobing1.txt')
model_sex1 = lgb.Booster(model_file='files/sex1.txt') # 按性别
model_sex2 = lgb.Booster(model_file='files/sex2.txt')
model_BMIFP = lgb.Booster(model_file='files/BMIFP.txt') # 按BMI-FP肥胖GZ过重PS偏瘦ZC正常
model_BMIGZ = lgb.Booster(model_file='files/BMIGZ.txt')
model_BMIPS = lgb.Booster(model_file='files/BMIPS.txt')
model_BMIZC = lgb.Booster(model_file='files/BMIZC.txt')
model_SBWBZC = lgb.Booster(model_file='files/SBWBZC.txt') # 按上臂围分类,正常与不正常
model_SBWZC = lgb.Booster(model_file='files/SBWZC.txt')
model_STJFP = lgb.Booster(model_file='files/STJFP.txt') # 按三角肌分类,有肥胖,消瘦,正常
model_STJXS = lgb.Booster(model_file='files/STJXS.txt')
model_STJZC = lgb.Booster(model_file='files/STJZC.txt')
model_YTBFP = lgb.Booster(model_file='files/YTBFP.txt') # 按腰臀比分类,肥胖和正常
model_YTBZC = lgb.Booster(model_file='files/YTBZC.txt')
food_score_all = model_all.predict(unit)
###开始给人分类,并且取得对应模型下的评分
# model_sex_score是基于性别的评分列表
if body['sex'] == 1: # 是男性
food_score_sex1 = model_sex1.predict(unit)
model_sex_score = food_score_sex1.tolist()
else:
food_score_sex2 = model_sex2.predict(unit)
model_sex_score = food_score_sex2.tolist()
if body['age'] <= 18:
food_score_age11 = model_age11.predict(unit)
model_age_score = food_score_age11.tolist()
elif body['age'] <= 28:
food_score_age19 = model_age19.predict(unit)
model_age_score = food_score_age19.tolist()
elif body['age'] <= 38:
food_score_age29 = model_age29.predict(unit)
model_age_score = food_score_age29.tolist()
elif body['age'] <= 48:
food_score_age39 = model_age39.predict(unit)
model_age_score = food_score_age39.tolist()
elif body['age'] <= 58:
food_score_age49 = model_age49.predict(unit)
model_age_score = food_score_age49.tolist()
elif body['age'] <= 68:
food_score_age59 = model_age59.predict(unit)
model_age_score = food_score_age59.tolist()
elif body['age'] <= 78:
food_score_age69 = model_age69.predict(unit)
model_age_score = food_score_age69.tolist()
else:
food_score_age79 = model_age79.predict(unit)
model_age_score = food_score_age79.tolist()
if body['gaoxueya'] == 1: # 有高血压
food_score_gaoxueya1 = model_gaoxueya1.predict(unit)
model_gaoxueya_score = food_score_gaoxueya1.tolist()
else:
food_score_gaoxueya0 = model_gaoxueya0.predict(unit)
model_gaoxueya_score = food_score_gaoxueya0.tolist()
if body['tangniaobing'] == 1: # 有糖尿病
food_score_tangniaobing1 = model_tangniaobing1.predict(unit)
model_tangniaobing_score = food_score_tangniaobing1.tolist()
else:
food_score_tangniaobing0 = model_tangniaobing0.predict(unit)
model_tangniaobing_score = food_score_tangniaobing0.tolist()
body['BMI'] = body['WEIGHT'] / body['HEIGHT'] / body['HEIGHT'] * 10000 # 通过身高体重计算BMI
if body['BMI'] <= 18.4:
food_score_BMIPS = model_BMIPS.predict(unit)
model_BMI_score = food_score_BMIPS.tolist()
elif body['BMI'] <= 23.9:
food_score_BMIZC = model_BMIZC.predict(unit)
model_BMI_score = food_score_BMIZC.tolist()
elif body['BMI'] <= 27.9:
food_score_BMIGZ = model_BMIGZ.predict(unit)
model_BMI_score = food_score_BMIGZ.tolist()
else:
food_score_BMIFP = model_BMIFP.predict(unit)
model_BMI_score = food_score_BMIFP.tolist()
if body['SBW'] <= 22.77 and body['sex'] == 1: # 上臂围不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
elif body['SBW'] <= 20.88 and body['sex'] == 2: # 不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_SBWZC = model_SBWZC.predict(unit)
model_SBW_score = food_score_SBWZC.tolist()
if body['YTB'] > 0.9 and body['sex'] == 1: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
elif body['YTB'] > 0.8 and body['sex'] == 2: # 腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_YTBZC = model_YTBZC.predict(unit)
model_YTB_score = food_score_YTBZC.tolist()
if body['STJ'] > 15 and body['sex'] == 1: # 男 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] > 19.8 and body['sex'] == 2: # 女 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ'] < 10 and body['sex'] == 1: # 男 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
elif body['STJ'] < 13.2 and body['sex'] == 2: # 女 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
else: # 其余情况,包括没有输入时,默认正常
food_score_STJZC = model_STJZC.predict(unit)
model_STJ_score = food_score_STJZC.tolist()
total_score = [] # 预置一个列表,开始对各模型的分数进行加权求和
weight = (1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8,
1 / 8,) # 用一个元组来存各模型分数的权重,这里是均匀分布,分别是 sex age gaoxueya tangniaobing BMI SBW STJ YTB
for i in range(0, 193): # 这里可以选择是否将每个维度归一化,注意这样确实会导致食材总评分数发生变化进而排序不相同,第二个就是归一化了的
"""score_i = weight[0]*model_sex_score[i]+weight[1]*model_age_score[i]+weight[2]*model_gaoxueya_score[i]+weight[3]*model_tangniaobing_score[i]\
+weight[4]*model_BMI_score[i]+weight[5]*model_SBW_score[i]+weight[6]*model_STJ_score[i]+weight[7]*model_YTB_score[i]"""
score_i = weight[0] * (model_sex_score[i] - min(model_sex_score)) / (
max(model_sex_score) - min(model_sex_score)) * 100 \
+ weight[1] * (model_age_score[i] - min(model_age_score)) / (
max(model_age_score) - min(model_age_score)) * 100 \
+ weight[2] * (model_gaoxueya_score[i] - min(model_gaoxueya_score)) / (
max(model_gaoxueya_score) - min(model_gaoxueya_score)) * 100 \
+ weight[3] * (model_tangniaobing_score[i] - min(model_tangniaobing_score)) / (
max(model_tangniaobing_score) - min(model_tangniaobing_score)) * 100 \
+ weight[4] * (model_BMI_score[i] - min(model_BMI_score)) / (
max(model_BMI_score) - min(model_BMI_score)) * 100 \
+ weight[5] * (model_SBW_score[i] - min(model_SBW_score)) / (
max(model_SBW_score) - min(model_SBW_score)) * 100 \
+ weight[6] * (model_STJ_score[i] - min(model_STJ_score)) / (
max(model_STJ_score) - min(model_STJ_score)) * 100 \
+ weight[7] * (model_YTB_score[i] - min(model_YTB_score)) / (
max(model_YTB_score) - min(model_YTB_score)) * 100
total_score.append(score_i)
# 接下来处理相同评分的食材,评分相同时,更小的食材代码优先
for i in range(0, 193):
total_score[i] = total_score[i] - i * 0.000000000001
# 食物列表
food_list = [111, 112, 113, 114, 115, 120, 121, 122, 123, 124, 131, 132, 141, 142,
151, 152, 190, 192, 211, 212, 213, 221, 222, 311, 312, 313, 314, 315, 321, 322,
331, 332, 341, 351, 352, 391, 392, 393, 411, 412, 413, 414, 421, 422, 431, 432,
441, 442, 443, 444, 445, 451, 452, 453, 454, 460, 471, 472, 473, 480, 510, 520,
611, 612, 613, 619, 621, 622, 623, 629, 631, 632, 633, 639, 641, 642, 643, 650,
661, 662, 710, 720, 811, 812, 813, 814, 821, 822, 823, 831, 832, 833, 841, 842,
843, 890, 911, 912, 913, 921, 922, 923, 931, 932, 933, 942, 943, 990, 1011, 1012,
1013, 1021, 1022, 1030, 1040, 1050, 1090, 1111, 1112, 1121, 1122, 1131, 1141,
1211, 1212, 1213, 1214, 1221, 1222, 1223, 1230, 1241, 1242, 1243, 1290, 1293,
1310, 1311, 1312, 1313, 1330, 1410, 1419, 1421, 1422, 1423, 1510, 1521, 1522,
1523, 1524, 1525, 1530, 1531, 1532, 1533, 1534, 1610, 1619, 1620, 1640, 1650,
1661, 1662, 1670, 1680, 1690, 1711, 1712, 1713, 1721, 1810, 1820, 1821, 1822,
1823, 1824, 1830, 1840, 1910, 1920, 2010, 2020, 2031, 2032, 2040, 2050, 2060,
2071, 2072, 2074, 2110, 2190] # 食物代码列表
dictfood = {111: '五谷香', 112: '小麦粉', 113: '', 114: '饼、馒头', 115: '面筋', 120: '稻米',
121: '粳米', 122: '籼米', 123: '糯米', 124: '米饭', 131: '玉米', 132: '玉米笋', 141: '大麦',
142: '青稞', 151: '小米', 152: '大黄米', 190: '高粱米', 192: '荞麦', 211: '土豆', 212: '甘薯',
213: '木薯', 221: '淀粉', 222: '粉丝', 311: '大豆', 312: '豆粉', 313: '豆腐', 314: '豆浆',
315: '豆腐干', 321: '绿豆', 322: '绿豆饼', 331: '红豆', 332: '豆沙', 341: '花豆', 351: '蚕豆',
352: '烤蚕豆', 391: '扁豆', 392: '豇豆', 393: '豌豆', 411: '萝卜', 412: '胡萝卜', 413: '大头菜',
414: '甜菜根', 421: '鲜豆', 422: '豆芽', 431: '茄子番茄辣椒', 432: '冬瓜黄瓜苦瓜南瓜等瓜类',
441: '大蒜', 442: '大葱', 443: '洋葱', 444: '韭菜', 445: '山蒜', 451: '大白菜', 452: '菜花',
453: '菠菜等蔬菜', 454: '竹笋', 460: '水生蔬菜', 471: '山药', 472: '芋头', 473: '', 480: '野生蔬菜',
510: '蘑菇', 520: '海带', 611: '苹果', 612: '', 613: '红果', 619: '海棠果', 621: '',
622: '李子', 623: '', 629: '酸枣', 631: '葡萄', 632: '石榴', 633: '', 639: '桑葚',
641: '', 642: '柑橘', 643: '', 650: '热带水果', 661: '哈密瓜', 662: '西瓜', 710: '坚果',
720: '花生瓜子', 811: '猪肉', 812: '猪杂', 813: '腊肉', 814: '香肠', 821: '牛肉', 822: '牛杂',
823: '牛肉干', 831: '羊肉', 832: '羊杂', 833: '羊肉串', 841: '驴肉', 842: '驴鞭', 843: '卤驴肉',
890: '狗肉兔肉', 911: '', 912: '鸡杂', 913: '烤鸡', 921: '', 922: '鸭杂', 923: '烤鸭',
931: '', 932: '鹅杂', 933: '烧鹅', 942: '火鸡杂', 943: '代码943的食物', 990: '鸽子', 1011: '牛奶',
1012: '羊奶', 1013: '人奶', 1021: '牛奶粉', 1022: '羊奶粉', 1030: '酸奶', 1040: '奶酪', 1050: '奶油',
1090: '其他乳制品', 1111: '鸡蛋', 1112: '松花蛋', 1121: '鸭蛋', 1122: '咸鸭蛋', 1131: '鹅蛋', 1141: '鹌鹑蛋',
1211: '', 1212: '黄鱼', 1213: '鱼油', 1214: '代码1214的食物', 1221: '', 1222: '虾米', 1223: '代码1223的食材',
1230: '螃蟹', 1241: '鲍鱼扇贝', 1242: '蛤蜊', 1243: '', 1290: '墨鱼鱿鱼', 1293: '代码1293的食物', 1310: '母乳化奶粉',
1311: '代码1311的食材', 1312: '代码1312的食材', 1313: '代码1313的食材', 1330: '婴幼儿补充食品', 1410: '小吃', 1419: '代码1419的食材',
1421: '蛋糕',
1422: '月饼', 1423: '蛋黄酥', 1510: '代码1510的食材 ', 1521: '麦片', 1522: '方便面', 1523: '面包', 1524: '饼干',
1525: '代码1525的食材', 1530: '薯片', 1531: '代码1531的食材', 1532: '代码1532的食材', 1533: '代码1533的食材', 1534: '代码1534的食材',
1610: '可乐',
1619: '代码1619的食材', 1620: '果汁', 1640: '果味奶', 1650: '植物蛋白饮料', 1661: '', 1662: '茶水', 1670: '固体饮料',
1680: '冰淇淋', 1690: '红景天饮料', 1711: '啤酒', 1712: '葡萄酒', 1713: '黄酒', 1721: '白酒', 1810: '',
1820: '糖果', 1821: '代码1821的食材', 1822: '代码1822的食材', 1823: '代码1823的食材', 1824: '代码1824的食材', 1830: '果脯',
1840: '代码1840的食物',
1910: '动物油', 1920: '植物油', 2010: '酱油', 2020: '', 2031: '豆瓣酱', 2032: '果酱', 2040: '腐乳',
2050: '咸菜', 2060: '香辛料', 2071: '', 2072: '味精', 2074: '代码2074的食材', 2110: '代码2110的食材', 2190: '代码2190的食材'}
# for score in sorted(total_score, reverse=True): # 降序排列
# print(score)#得到食材评分
# print(total_score.index(score))#得到排序后的分数的下标
# print(food_list[total_score.index(score)])#得到该下标对应的食材代码
# print(dictfood[food_list[total_score.index(score)]]) # 得到食材代码对应的食材
# print("--------------")
zq_food = ['大米', '小米', '小麦', '玉米', '黄豆', '绿豆', '山药', '莲子', '花生', '核桃', '芝麻', '红薯', '燕麦', '薏米', '土豆',
'冬瓜', '白菜', '木耳', '茄子', '青椒', '西葫芦', '丝瓜', '南瓜', '苦瓜', '黄瓜', '百合', '竹笋', '芹菜', '洋葱', '菠菜',
'萝卜', '莲藕', '豆芽', '莴笋', '空心菜', '西红柿', '黄花菜', '四季豆', '胡萝卜', '韭菜', '茭白', '芋头', '香菜', '大蒜',
'大葱', '生姜', '苹果', '梨子', '桃子', '李子', '柿子', '橘子', '葡萄', '香蕉', '大枣', '芒果', '西瓜', '草莓', '菠萝',
'柠檬', '哈蜜瓜', '猕猴桃', '木瓜', '猪肉', '猪肝', '牛肉', '羊肉', '鸡肉', '鸭肉', '鲤鱼', '鲫鱼', '鲍鱼', '黄鳝', '',
'', '', '海带', '牛奶', '鸡蛋', '蜂蜜']
zq_food_code = [120, 151, 112, 131, 311, 321, 471, 720, 720, 710, 720, 212, 1521, 190, 211, 432, 451, 510, 431, 431,
432, 432, 432, 432, 432,
454, 454, 453, 443, 453, 411, 460, 422, 453, 453, 431, 454, 421, 412, 444, 460, 472, 453, 441, 442, 473,
611, 612, 621, 622,
633, 641, 631, 650, 623, 650, 662, 639, 650, 643, 661, 639, 650, 811, 812, 821, 831, 911, 921, 1211,
1211, 1241, 1211, 1242,
1230, 1221, 520, 1011, 1111, 1810]
# print(food_list.index(zq_food_code[0]))#这是获得一个食材代码在我原始列表中的下标,用此下标可以获得评分
zq_score = []
for zq_food_code_elem in zq_food_code:
zq_score.append(total_score[food_list.index(zq_food_code_elem)]) # 获得梓强的食材的评分是一个有序列表对应着excel表的序
for i in range(0, 80): # 处理重码,使评分与下标是一一对应的关系
zq_score[i] = (zq_score[i] - i * 0.000000000001 )/ 10
#print(i,"--",zq_score[i])
#for score in sorted(zq_score, reverse=True): # 降序排列
# print(zq_food[zq_score.index(score)],end=":")
#print(score)
# print(10*(score-min(zq_score))/(max(zq_score)-min(zq_score)))#归一化为0到10分
#pass
# print(score)#得到食材评分
# print(zq_score.index(score))#得到排序后的分数的下标
for i in range(0, 80): # 评分归一化
zq_score[i] = 10*(zq_score[i]-min(zq_score))/(max(zq_score)-min(zq_score))
for i in range(0, 80): # 评分归一化
zq_score[i] = '%.1f' %zq_score[i]
return zq_score

@ -1,2 +0,0 @@
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

@ -1,223 +0,0 @@
#进行直接载入模型,然后给出该模型下对每种食材的评分
import lightgbm as lgb
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import metrics
unit = pd.read_csv("100unit.csv") #每种食物100g的矩阵
#body = 读取人的身体数据然后开始分类。这里的body是一个字典类型
body = {'sex':1,
'age':44,
'gaoxueya':0,
'tangniaobing':1,
'HEIGHT':168,
'WEIGHT':58,
'YTB':1,
'STJ':12,
'SBW':23
}#一个示例
### 读取模型
model_all = lgb.Booster(model_file='all.txt')#总的所有人的数据训练的模型
model_age11 = lgb.Booster(model_file='age11-18.txt')#按年龄分类
model_age19 = lgb.Booster(model_file='age19-28.txt')
model_age29 = lgb.Booster(model_file='age29-38.txt')
model_age39 = lgb.Booster(model_file='age39-48.txt')
model_age49 = lgb.Booster(model_file='age49-58.txt')
model_age59 = lgb.Booster(model_file='age59-68.txt')
model_age69 = lgb.Booster(model_file='age69-78.txt')
model_age79 = lgb.Booster(model_file='age79-100.txt')
model_gaoxueya0 = lgb.Booster(model_file='gaoxueya0.txt')#按高血压情况
model_gaoxueya1 = lgb.Booster(model_file='gaoxueya1.txt')
model_tangniaobing0 = lgb.Booster(model_file='tangniaobing0.txt')#按糖尿病情况
model_tangniaobing1 = lgb.Booster(model_file='tangniaobing1.txt')
model_sex1 = lgb.Booster(model_file='sex1.txt')#按性别
model_sex2 = lgb.Booster(model_file='sex2.txt')
model_BMIFP = lgb.Booster(model_file='BMIFP.txt')#按BMI-FP肥胖GZ过重PS偏瘦ZC正常
model_BMIGZ = lgb.Booster(model_file='BMIGZ.txt')
model_BMIPS = lgb.Booster(model_file='BMIPS.txt')
model_BMIZC = lgb.Booster(model_file='BMIZC.txt')
model_SBWBZC = lgb.Booster(model_file='SBWBZC.txt')#按上臂围分类,正常与不正常
model_SBWZC = lgb.Booster(model_file='SBWZC.txt')
model_STJFP = lgb.Booster(model_file='STJFP.txt')#按三角肌分类,有肥胖,消瘦,正常
model_STJXS = lgb.Booster(model_file='STJXS.txt')
model_STJZC = lgb.Booster(model_file='STJZC.txt')
model_YTBFP = lgb.Booster(model_file='YTBFP.txt')#按腰臀比分类,肥胖和正常
model_YTBZC = lgb.Booster(model_file='YTBZC.txt')
food_score_all=model_all.predict(unit)
###开始给人分类,并且取得对应模型下的评分
# model_sex_score是基于性别的评分列表
if body['sex']==1:#是男性
food_score_sex1=model_sex1.predict(unit)
model_sex_score = food_score_sex1.tolist()
else :
food_score_sex2=model_sex2.predict(unit)
model_sex_score = food_score_sex2.tolist()
if body['age']<=18:
food_score_age11=model_age11.predict(unit)
model_age_score = food_score_age11.tolist()
elif body['age']<=28:
food_score_age19=model_age19.predict(unit)
model_age_score = food_score_age19.tolist()
elif body['age']<=38:
food_score_age29=model_age29.predict(unit)
model_age_score = food_score_age29.tolist()
elif body['age']<=48:
food_score_age39=model_age39.predict(unit)
model_age_score = food_score_age39.tolist()
elif body['age']<=58:
food_score_age49=model_age49.predict(unit)
model_age_score = food_score_age49.tolist()
elif body['age']<=68:
food_score_age59=model_age59.predict(unit)
model_age_score = food_score_age59.tolist()
elif body['age']<=78:
food_score_age69=model_age69.predict(unit)
model_age_score = food_score_age69.tolist()
else:
food_score_age79=model_age79.predict(unit)
model_age_score = food_score_age79.tolist()
if body['gaoxueya']==1:#有高血压
food_score_gaoxueya1=model_gaoxueya1.predict(unit)
model_gaoxueya_score = food_score_gaoxueya1.tolist()
else :
food_score_gaoxueya0=model_gaoxueya0.predict(unit)
model_gaoxueya_score = food_score_gaoxueya0.tolist()
if body['tangniaobing']==1:#有糖尿病
food_score_tangniaobing1=model_tangniaobing1.predict(unit)
model_tangniaobing_score = food_score_tangniaobing1.tolist()
else :
food_score_tangniaobing0=model_tangniaobing0.predict(unit)
model_tangniaobing_score = food_score_tangniaobing0.tolist()
body['BMI']=body['WEIGHT']/body['HEIGHT']/body['HEIGHT']*10000 #通过身高体重计算BMI
if body['BMI']<=18.4:
food_score_BMIPS=model_BMIPS.predict(unit)
model_BMI_score = food_score_BMIPS.tolist()
elif body['BMI']<=23.9:
food_score_BMIZC=model_BMIZC.predict(unit)
model_BMI_score = food_score_BMIZC.tolist()
elif body['BMI']<=27.9:
food_score_BMIGZ=model_BMIGZ.predict(unit)
model_BMI_score = food_score_BMIGZ.tolist()
else:
food_score_BMIFP=model_BMIFP.predict(unit)
model_BMI_score = food_score_BMIFP.tolist()
if body['SBW']<=22.77 and body['sex']==1:#上臂围不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
elif body['SBW']<=20.88 and body['sex']==2:#不正常
food_score_SBWBZC = model_SBWBZC.predict(unit)
model_SBW_score = food_score_SBWBZC.tolist()
else:#其余情况,包括没有输入时,默认正常
food_score_SBWZC = model_SBWZC.predict(unit)
model_SBW_score = food_score_SBWZC.tolist()
if body['YTB']>0.9 and body['sex']==1:#腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
elif body['YTB']>0.8 and body['sex']==2:#腰臀比不正常
food_score_YTBFP = model_YTBFP.predict(unit)
model_YTB_score = food_score_YTBFP.tolist()
else:#其余情况,包括没有输入时,默认正常
food_score_YTBZC = model_YTBZC.predict(unit)
model_YTB_score = food_score_YTBZC.tolist()
if body['STJ']>15 and body['sex']==1:#男 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ']>19.8 and body['sex']==2:#女 三头肌肥胖
food_score_STJFP = model_STJFP.predict(unit)
model_STJ_score = food_score_STJFP.tolist()
elif body['STJ']<10 and body['sex']==1:#男 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
elif body['STJ']<13.2 and body['sex']==2:#女 三头肌消瘦
food_score_STJXS = model_STJXS.predict(unit)
model_STJ_score = food_score_STJXS.tolist()
else :#其余情况,包括没有输入时,默认正常
food_score_STJZC = model_STJZC.predict(unit)
model_STJ_score = food_score_STJZC.tolist()
total_score=[]#预置一个列表,开始对各模型的分数进行加权求和
weight=(1/8,1/8,1/8,1/8,1/8,1/8,1/8,1/8,) #用一个元组来存各模型分数的权重,这里是均匀分布,分别是 sex age gaoxueya tangniaobing BMI SBW STJ YTB
for i in range(0,193):#这里可以选择是否将每个维度归一化,注意这样确实会导致食材总评分数发生变化进而排序不相同
#score_i = weight[0]*model_sex_score[i]+weight[1]*model_age_score[i]+weight[2]*model_gaoxueya_score[i]+weight[3]*model_tangniaobing_score[i]+weight[4]*model_BMI_score[i]+weight[5]*model_SBW_score[i]+weight[6]*model_STJ_score[i]+weight[7]*model_YTB_score[i]
score_i = weight[0]*(model_sex_score[i]-min(model_sex_score))/(max(model_sex_score)-min(model_sex_score))*100+weight[1]*(model_age_score[i]-min(model_age_score))/(max(model_age_score)-min(model_age_score))*100+weight[2]*(model_gaoxueya_score[i]-min(model_gaoxueya_score))/(max(model_gaoxueya_score)-min(model_gaoxueya_score))*100+weight[3]*(model_tangniaobing_score[i]-min(model_tangniaobing_score))/(max(model_tangniaobing_score)-min(model_tangniaobing_score))*100 + weight[4]*(model_BMI_score[i]-min(model_BMI_score))/(max(model_BMI_score)-min(model_BMI_score))*100+weight[5]*(model_SBW_score[i]-min(model_SBW_score))/(max(model_SBW_score)-min(model_SBW_score))*100+weight[6]*(model_STJ_score[i]-min(model_STJ_score))/(max(model_STJ_score)-min(model_STJ_score))*100+weight[7]*(model_YTB_score[i]-min(model_YTB_score))/(max(model_YTB_score)-min(model_YTB_score))*100
total_score.append(score_i)
#接下来处理相同评分的食材,评分相同时,更小的食材代码优先
for i in range(0,193):
total_score[i]=total_score[i]-i*0.000000000001
#食物列表
food_list=[111, 112, 113, 114, 115, 120, 121, 122, 123, 124, 131, 132, 141, 142,
151, 152, 190, 192, 211, 212, 213, 221, 222, 311, 312, 313, 314, 315, 321, 322,
331, 332, 341, 351, 352, 391, 392, 393, 411, 412, 413, 414, 421, 422, 431, 432,
441, 442, 443, 444, 445, 451, 452, 453, 454, 460, 471, 472, 473, 480, 510, 520,
611, 612, 613, 619, 621, 622, 623, 629, 631, 632, 633, 639, 641, 642, 643, 650,
661, 662, 710, 720, 811, 812, 813, 814, 821, 822, 823, 831, 832, 833, 841, 842,
843, 890, 911, 912, 913, 921, 922, 923, 931, 932, 933, 942, 943, 990, 1011, 1012,
1013, 1021, 1022, 1030, 1040, 1050, 1090, 1111, 1112, 1121, 1122, 1131, 1141,
1211, 1212, 1213, 1214, 1221, 1222, 1223, 1230, 1241, 1242, 1243, 1290, 1293,
1310, 1311, 1312, 1313, 1330, 1410, 1419, 1421, 1422, 1423, 1510, 1521, 1522,
1523, 1524, 1525, 1530, 1531, 1532, 1533, 1534, 1610, 1619, 1620, 1640, 1650,
1661, 1662, 1670, 1680, 1690, 1711, 1712, 1713, 1721, 1810, 1820, 1821, 1822,
1823, 1824, 1830, 1840, 1910, 1920, 2010, 2020, 2031, 2032, 2040, 2050, 2060,
2071, 2072, 2074, 2110, 2190] #食物代码列表
dictfood = {111:'五谷香',112:'小麦粉',113:'',114:'饼、馒头',115:'面筋',120:'稻米',
121:'粳米',122:'籼米',123:'糯米',124:'米饭',131:'玉米',132:'玉米笋',141:'大麦',
142:'青稞',151:'小米',152:'大黄米',190:'高粱米',192:'荞麦',211:'土豆',212:'甘薯',
213:'木薯',221:'淀粉',222:'粉丝',311:'大豆',312:'豆粉',313:'豆腐',314:'豆浆',
315:'豆腐干',321:'绿豆',322:'绿豆饼',331:'红豆',332:'豆沙',341:'花豆',351:'蚕豆',
352:'烤蚕豆',391:'扁豆',392:'豇豆',393:'豌豆',411:'萝卜',412:'胡萝卜',413:'大头菜',
414:'甜菜根',421:'鲜豆',422:'豆芽',431:'茄子番茄辣椒',432:'冬瓜黄瓜苦瓜南瓜等瓜类',
441:'大蒜',442:'大葱',443:'洋葱',444:'韭菜',445:'山蒜',451:'大白菜',452:'菜花',
453:'菠菜等蔬菜',454:'竹笋',460:'水生蔬菜',471:'山药',472:'芋头',473:'',480:'野生蔬菜',
510:'蘑菇',520:'海带',611:'苹果',612:'',613:'红果',619:'海棠果',621:'',
622:'李子',623:'',629:'酸枣',631:'葡萄',632:'石榴',633:'',639:'桑葚',
641:'',642:'柑橘',643:'',650:'热带水果',661:'哈密瓜',662:'西瓜',710:'坚果',
720:'花生瓜子',811:'猪肉',812:'猪杂',813:'腊肉',814:'香肠',821:'牛肉',822:'牛杂',
823:'牛肉干',831:'羊肉',832:'羊杂',833:'羊肉串',841:'驴肉',842:'驴鞭',843:'卤驴肉',
890:'狗肉兔肉',911:'',912:'鸡杂',913:'烤鸡',921:'',922:'鸭杂',923:'烤鸭',
931:'',932:'鹅杂',933:'烧鹅',942:'火鸡杂',943:'代码943的食物',990:'鸽子',1011:'牛奶',
1012:'羊奶',1013:'人奶',1021:'牛奶粉',1022:'羊奶粉',1030:'酸奶',1040:'奶酪',1050:'奶油',
1090:'其他乳制品',1111:'鸡蛋',1112:'松花蛋',1121:'鸭蛋',1122:'咸鸭蛋',1131:'鹅蛋',1141:'鹌鹑蛋',
1211:'',1212:'黄鱼',1213:'鱼油',1214:'代码1214的食物',1221:'',1222:'虾米',1223:'代码1223的食材',
1230:'螃蟹',1241:'鲍鱼扇贝',1242:'蛤蜊',1243:'',1290:'墨鱼鱿鱼',1293:'代码1293的食物',1310:'母乳化奶粉',
1311:'代码1311的食材',1312:'代码1312的食材',1313:'代码1313的食材',1330:'婴幼儿补充食品',1410:'小吃',1419:'代码1419的食材',1421:'蛋糕',
1422:'月饼',1423:'蛋黄酥',1510:'代码1510的食材 ',1521:'麦片',1522:'方便面',1523:'面包',1524:'饼干',
1525:'代码1525的食材',1530:'薯片',1531:'代码1531的食材',1532:'代码1532的食材',1533:'代码1533的食材',1534:'代码1534的食材',1610:'可乐',
1619:'代码1619的食材',1620:'果汁',1640:'果味奶',1650:'植物蛋白饮料',1661:'',1662:'茶水',1670:'固体饮料',
1680:'冰淇淋',1690:'红景天饮料',1711:'啤酒',1712:'葡萄酒',1713:'黄酒',1721:'白酒',1810:'',
1820:'糖果',1821:'代码1821的食材',1822:'代码1822的食材',1823:'代码1823的食材',1824:'代码1824的食材',1830:'果脯',1840:'代码1840的食物',
1910:'动物油',1920:'植物油',2010:'酱油',2020:'',2031:'豆瓣酱',2032:'果酱',2040:'腐乳',
2050:'咸菜',2060:'香辛料',2071:'',2072:'味精',2074:'代码2074的食材',2110:'代码2110的食材',2190:'代码2190的食材'}
for score in sorted(total_score,reverse=True):#降序排列
#print(score)#得到食材评分
#print(total_score.index(score))#得到排序后的分数的下标
#print(food_list[total_score.index(score)])#得到该下标对应的食材代码
print(dictfood[food_list[total_score.index(score)]])#得到食材代码对应的食材
#print("--------------")

@ -1,174 +0,0 @@
from typing import Any, Union
from flask import request
import json,random
import re,requests,os
import xlrd
import linecache
import array
def to_Data():
# data = request.get_data() # 获取前端数据
# data = str(data, 'utf-8') # 转utf-8
# data = json.loads(data) # json转字典
data = json.loads(request.get_data().decode("utf-8"))
if data:
return data
else:
return {}
def to_Json(list = None):
if list:
data = json.dumps(list, ensure_ascii = False)
else:
data = "0"
return data
def get_Image(name,number,write):
url = "http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word={}".format(name)
html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
file = open("imageurl.txt", "a")
i = 0
for each in pic_url:
if(i<number):
i=i+1
continue
try:
pic = requests.get(each, timeout=1)
except:
print('当前图片无法下载')
else:
print(each)
if(i >= number):
if(write):
file.write(name + '\n')
file.write(each + '\n')
file.close()
return each
i = i + 1
def download_Image(name,number,id):
url = "http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word={}".format(name)
html = requests.get(url).text
image_path = os.path.join(os.path.dirname(__file__), "images/download")
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
if not os.path.exists(image_path):
os.makedirs(image_path)
i = 0
for each in pic_url:
file_name = image_path + '/' + str(id) + '.jpg'
print(each)
try:
pic = requests.get(each, timeout=10)
except:
print('当前图片无法下载')
continue
if(i==number):
return 0
f = open(file_name, 'wb')
f.write(pic.content)
f.close()
i += 1
def init_Food():
# 打开文件
meal=[]
workbook = xlrd.open_workbook(r'list.xlsx')
sheet = workbook.sheet_by_index(0) # sheet索引从0开始
# 获取单元格内容
for i in range(0,80):
v=['','','','','','','','','','','','','','','','','']
for j in range(0,17):
v[j]=sheet.cell(i, j).value
if(v[j]==''):
v[j] = 0
if(i>=0 and i<=13):
cata='food,grain'
if(i>=14 and i<=45):
cata='food,vegetable'
if(i>=46 and i<=62):
cata='food,fruit'
if(i>=63 and i<=79):
cata='food,meat'
#download_Image(v[0],1,i)
m = dict(id=i,name=v[0], cal=v[16], nutrition=[v[1],v[2],v[3],v[14],v[15],v[4],v[8],v[9],v[6],v[5],v[7],v[10],v[11],v[12],v[13]],cata=cata)
meal.append(m)
print(meal)
return(meal)
def init_Meal(food,mealdata):
for i in range(0,len(mealdata)):
m=get_Meal(mealdata[i],food)
print(m)
food.append(m)
return food
def get_Meal(m,food):
cal=0
nutrition=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for i in m['list']:
cal+=food[i]['cal']
if(food[i]['id']>=105):
cal*=5
cal = round(cal, 1)
for j in range(0,15):
nutrition[j]+=food[i]['nutrition'][j]
nutrition[j]=round(nutrition[j],2)
m=dict(id=len(food),name=m['name'],cal=cal,nutrition=nutrition,cata='meal,'+m['cata'],list=m['list'])
return m
def get_AllImage(meal,list):
for m in meal:
name = m['name']
#url = get_Image(name, 0, True)
url = linecache.getline('imageurl.txt', (m['id']+1)*2)
m['image']=url
for i in list:
#name = meal[i]['name']
#download_Image(name, 1, i)
id = str(meal[i]['id'])
meal[i]['image'] = 'https://luckybugqqq.qicp.io/image/' + id;
return meal
def get_Score(m,u,meal):
if(m['id']>=80):
s = 0
for i in m['list']:
s += float(meal[i]['score'])
s /= len(m['list'])
else:
cal=float(m['cal'])
nutrition=list(map(float,m['nutrition']))
gender=u['gender']
fatrate=float(u['fatrate'])
age=u['birthday']
height=int(u['height'])+100
weight=int(u['weight'])
bmi=float(weight)/float(height*height)
xieya=u['xieya'][0]+u['xieya'][1]
xietang=u['xietang']
mental=u['tnb']
s1=cal*(bmi+fatrate)
s2=0
index=[1,10,-10,200,-1,5,50,5,10,10,1,1,10,0.1,10]
for i in range(0,14):
s2+=float(nutrition[i])*index[i]
s= round((s2*1.5-s1+10000)/20000*10,1)
if(s>9.9):
s=9.9
if(s<0.1):
s=0.1
#print( str(s))
return '%.1f' %s

@ -1,63 +0,0 @@
#进行模型训练
import lightgbm as lgb
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import metrics
###设置是否保存模型,1为保存2为不保存
savemodel = 0
###设置文件交互
model_name = 'abc.txt' #定义模型存储文件的名
data_file = 'age11-18.csv' #指明数据集文件
data = pd.read_csv(data_file)#读取数据集。要求有ID饮食习惯和health分数
unit = pd.read_csv("100unit.csv") #每种食物100g的矩阵用以计算每种食物的评分
### 数据拆分(训练集+验证集+测试集)
print('数据拆分')
train_xy,offline_test = train_test_split(data,test_size = 0.2,random_state=21)#offline是测试集
train,val = train_test_split(train_xy,test_size = 0.2,random_state=21)#train是训练集val是验证集
# 训练集
y_train = train.health # 训练集标签
X_train = train.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 训练集特征矩阵,抛开无关特征
# 验证集
y_val = val.health # 验证集标签
X_val = val.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 验证集特征矩阵
# 测试集
offline_test_X = offline_test.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 线下测试特征矩阵
### 数据转换
print('数据转换')
lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
lgb_eval = lgb.Dataset(X_val, y_val, reference=lgb_train,free_raw_data=False)
###训练
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': {'l2', 'auc'},
'num_leaves': 16,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1
}
print ("开始训练")
model=lgb.train(
params, # 参数字典
lgb_train, # 训练集
valid_sets=lgb_eval, # 验证集
num_boost_round=500, # 迭代次数
)
if savemodel == 1:
model.save_model(model_name) # 训练后保存模型到文件

@ -1,63 +0,0 @@
#进行模型训练
import lightgbm as lgb
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import metrics
###设置是否保存模型,1为保存2为不保存
savemodel = 0
###设置文件交互
model_name = 'abc.txt' #定义模型存储文件的名
data_file = 'age11-18.csv' #指明数据集文件
data = pd.read_csv(data_file)#读取数据集。要求有ID饮食习惯和health分数
unit = pd.read_csv("100unit.csv") #每种食物100g的矩阵用以计算每种食物的评分
### 数据拆分(训练集+验证集+测试集)
print('数据拆分')
train_xy,offline_test = train_test_split(data,test_size = 0.2,random_state=21)#offline是测试集
train,val = train_test_split(train_xy,test_size = 0.2,random_state=21)#train是训练集val是验证集
# 训练集
y_train = train.health # 训练集标签
X_train = train.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 训练集特征矩阵,抛开无关特征
# 验证集
y_val = val.health # 验证集标签
X_val = val.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 验证集特征矩阵
# 测试集
offline_test_X = offline_test.drop(['IDIND','health','age','sex','U22','U24A','SYSTOL1','SYSTOL2',
'SYSTOL3','DIASTOL1','DIASTOL2','DIASTOL3','HEIGHT','WEIGHT',
'U7','U8A','U8B','U8C','U9','U10'],axis=1) # 线下测试特征矩阵
### 数据转换
print('数据转换')
lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
lgb_eval = lgb.Dataset(X_val, y_val, reference=lgb_train,free_raw_data=False)
###训练
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': {'l2', 'auc'},
'num_leaves': 16,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1
}
print ("开始训练")
model=lgb.train(
params, # 参数字典
lgb_train, # 训练集
valid_sets=lgb_eval, # 验证集
num_boost_round=500, # 迭代次数
)
if savemodel == 1:
model.save_model(model_name) # 训练后保存模型到文件

@ -1,31 +0,0 @@
from exts import db
class Admin(db.Model):
__tablename__ = 'admin'
Adminaccount = db.Column(db.String(255, 'utf8_general_ci'), primary_key=True)
Password = db.Column(db.String(255, 'utf8_general_ci'), nullable=False)
class Project(db.Model):
__tablename__ = 'project'
ID = db.Column(db.Integer, primary_key=True)
SNo = db.Column(db.ForeignKey('student.SNo', ondelete='CASCADE', onupdate='CASCADE'), nullable=False, index=True)
Project = db.Column(db.String(255))
Award = db.Column(db.String(255))
Code = db.Column(db.String(255))
student = db.relationship('Student', primaryjoin='Project.SNo == Student.SNo', backref='projects')
class Student(db.Model):
__tablename__ = 'student'
SNo = db.Column(db.String(255, 'utf8_general_ci'), primary_key=True, index=True)
Avatar = db.Column(db.String(255, 'utf8_general_ci'), index=True)
SName = db.Column(db.String(255, 'utf8_general_ci'), nullable=False)
Grade = db.Column(db.String(255, 'utf8_general_ci'), nullable=False)
Group = db.Column(db.String(255, 'utf8_general_ci'), nullable=False)
Telephone = db.Column(db.String(255, 'utf8_general_ci'))
WeChat = db.Column(db.String(255, 'utf8_general_ci'))
QQ = db.Column(db.String(255, 'utf8_general_ci'))
MailBox = db.Column(db.String(255, 'utf8_general_ci'))
Other = db.Column(db.String(255, 'utf8_general_ci'))
Occupation = db.Column(db.String(255, 'utf8_general_ci'))
WorkAddress = db.Column(db.String(255, 'utf8_general_ci'))
Direction = db.Column(db.String(255, 'utf8_general_ci'))

@ -1,332 +0,0 @@
'''
个人偏好+推荐系统
1 输入用户和对应饮食记录 输入用户位置
2 匹配菜谱
3 评分排序 属于用户位置的菜谱加分
'''
from math import sqrt
#地域推荐系统
mealdata = [{'name': '土豆烧牛肉', 'list': [65, 65, 65, 14, 38], 'cata': 'lunch'},
{'name': '番茄炒蛋', 'list': [78, 78, 35, 35, 35, 35], 'cata': 'lunch'},
{'name': '麻婆豆腐', 'list': [4, 4, 4, 4, 19], 'cata': 'lunch'},
{'name': '宫保鸡丁', 'list': [8, 67, 67], 'cata': 'lunch'},
{'name': '糖醋排骨', 'list': [63, 63, 63, 63], 'cata': 'lunch'},
{'name': '酸辣土豆丝', 'list': [14, 14, 19], 'cata': 'lunch,vegetarian'},
{'name': '地三鲜', 'list': [14, 14, 18, 18, 19, 19], 'cata': 'lunch,vegetarian'},
{'name': '蛋炒饭', 'list': [78, 0], 'cata': 'lunch,dinner'},
{'name': '小笼包', 'list': [2, 63], 'cata': 'breakfast'},
{'name': '重庆小面', 'list': [2, 19], 'cata': 'breakfast,dinner,noodle'},
{'name': '全麦面包', 'list': [2], 'cata': 'breakfast,keep'},
{'name': '牛肉汉堡', 'list': [2, 65], 'cata': 'breakfast,dinner'},
{'name': '皮蛋瘦肉粥', 'list': [12, 63, 78], 'cata': 'breakfast'},
{'name': '水果燕麦粥', 'list': [12, 13, 57], 'cata': 'breakfast,keep,vegetarian'},
{'name': '意大利面', 'list': [2, 35], 'cata': 'breakfast,noodle'},
{'name': '水果沙拉', 'list': [57, 58, 59], 'cata': 'breakfast,dinner,keep,vegetarian'},
{'name': '香煎牛排', 'list': [65, 65], 'cata': 'dinner,keep'},
{'name': '炸酱面', 'list': [2, 43, 44], 'cata': 'dinner,noodle'},
{'name': '豚骨拉面', 'list': [2, 43, 20], 'cata': 'dinner,noodle'},
{'name': '柠檬鸡胸', 'list': [59, 67, 67], 'cata': 'dinner,keep'},
{'name': '白灼西兰花', 'list': [40, 40], 'cata': 'lunch,dinner,vegetarian'},
{'name': '开水白菜', 'list': [16, 16], 'cata': 'lunch,dinner,vegetarian'},
{'name': '凉拌萝卜丝', 'list': [30, 30], 'cata': 'lunch,dinner,vegetarian'},
{'name': '生煎金枪鱼', 'list': [70, 70, 70], 'cata': 'dinner,keep'},
{'name': '荞麦面', 'list': [1, 2, 3], 'cata': 'breakfast,dinner,noodle,keep'},
{'name': '薯条', 'list': [66,67], 'cata': 'snack'},
{'name': '冰激凌', 'list': [65,66], 'cata': 'snack'},
{'name': '巧克力', 'list': [65], 'cata': 'snack'},
{'name': '棒棒糖', 'list': [66], 'cata': 'snack'},
{'name': '威化饼干', 'list': [67,68], 'cata': 'snack'},
{'name': '双皮奶', 'list': [68], 'cata': 'snack'},
{'name': '牛肉干', 'list': [69], 'cata': 'snack'},
{'name': '炸鸡腿', 'list': [79], 'cata': 'snack'},
{'name': '三黄油鸡', 'list': [68, 25, 18], 'cata': 'lunch,dinner,shanghai'},
{'name': '丝瓜炒小鲜', 'list': [22, 25, 18], 'cata': 'breakfast,dinner,shanghai'},
{'name': '乳香四季豆', 'list': [38, 25, 78], 'cata': 'lunch,dinner,shanghai'},
{'name': '冰糟鳕鱼冻', 'list': [71, 60, 18], 'cata': 'lunch,dinner,shanghai'},
{'name': '凤吞花菇', 'list': [68, 25, 18], 'cata': 'lunch,dinner,shanghai'},
{'name': '凤尾明虾', 'list': [68, 76, 77], 'cata': 'lunch,dinner,shanghai'},
{'name': '沪式炒素虾仁', 'list': [76, 25, 18], 'cata': 'lunch,dinner,shanghai'}
]
#前端获取的用户饮食数据
user_test =[{'id': 0, 'frequency': 2},
{'id': 1, 'frequency': 2},
{'id': 2, 'frequency': 0},
{'id': 3, 'frequency': 1},
{'id': 4, 'frequency': 0},
{'id': 5, 'frequency': 0},
{'id': 6, 'frequency': 0},
{'id': 7, 'frequency': 0},
{'id': 8, 'frequency': 0},
{'id': 9, 'frequency': 3},
{'id': 10, 'frequency': 2},
{'id': 11, 'frequency': 1},
{'id': 12, 'frequency': 0},
{'id': 13, 'frequency': 0},
{'id': 14, 'frequency': 0},
{'id': 15, 'frequency': 0},
{'id': 16, 'frequency': 0},
{'id': 17, 'frequency': 0},
{'id': 18, 'frequency': 0},
{'id': 19, 'frequency': 0},
{'id': 20, 'frequency': 0},
{'id': 21, 'frequency': 0},
{'id': 22, 'frequency': 0},
{'id': 23, 'frequency': 0},
{'id': 24, 'frequency': 0},
{'id': 25, 'frequency': 0},
{'id': 26, 'frequency': 0},
{'id': 27, 'frequency': 0},
{'id': 28, 'frequency': 0},
{'id': 29, 'frequency': 0},
{'id': 30, 'frequency': 0},
{'id': 31, 'frequency': 0},
{'id': 32, 'frequency': 0},
{'id': 33, 'frequency': 0},
{'id': 34, 'frequency': 0},
{'id': 35, 'frequency': 0},
{'id': 36, 'frequency': 0},
{'id': 37, 'frequency': 0},
{'id': 38, 'frequency': 0},
{'id': 39, 'frequency': 0},]
#已有用户饮食记录
user_001 = [{'id': 0, 'frequency': 2},
{'id': 1, 'frequency': 2},
{'id': 2, 'frequency': 1},
{'id': 3, 'frequency': 1},
{'id': 4, 'frequency': 0},
{'id': 5, 'frequency': 1},
{'id': 6, 'frequency': 0},
{'id': 7, 'frequency': 1},
{'id': 8, 'frequency': 0},
{'id': 9, 'frequency': 0},
{'id': 10, 'frequency': 0},
{'id': 11, 'frequency': 0},
{'id': 12, 'frequency': 0},
{'id': 13, 'frequency': 0},
{'id': 14, 'frequency': 0},
{'id': 15, 'frequency': 0},
{'id': 16, 'frequency': 0},
{'id': 17, 'frequency': 0},
{'id': 18, 'frequency': 0},
{'id': 19, 'frequency': 1},
{'id': 20, 'frequency': 0},
{'id': 21, 'frequency': 0},
{'id': 22, 'frequency': 0},
{'id': 23, 'frequency': 0},
{'id': 24, 'frequency': 0},
{'id': 25, 'frequency': 0},
{'id': 26, 'frequency': 0},
{'id': 27, 'frequency': 0},
{'id': 28, 'frequency': 0},
{'id': 29, 'frequency': 0},
{'id': 30, 'frequency': 0},
{'id': 31, 'frequency': 0},
{'id': 32, 'frequency': 0},
{'id': 33, 'frequency': 0},
{'id': 34, 'frequency': 0},
{'id': 35, 'frequency': 0},
{'id': 36, 'frequency': 0},
{'id': 37, 'frequency': 0},
{'id': 38, 'frequency': 0},
{'id': 39, 'frequency': 0}, ]
user_002 = [{'id': 0, 'frequency': 1},
{'id': 1, 'frequency': 0},
{'id': 2, 'frequency': 0},
{'id': 3, 'frequency': 0},
{'id': 4, 'frequency': 0},
{'id': 5, 'frequency': 0},
{'id': 6, 'frequency': 1},
{'id': 7, 'frequency': 2},
{'id': 8, 'frequency': 0},
{'id': 9, 'frequency': 1},
{'id': 10, 'frequency': 0},
{'id': 11, 'frequency': 0},
{'id': 12, 'frequency': 1},
{'id': 13, 'frequency': 0},
{'id': 14, 'frequency': 0},
{'id': 15, 'frequency': 0},
{'id': 16, 'frequency': 0},
{'id': 17, 'frequency': 0},
{'id': 18, 'frequency': 0},
{'id': 19, 'frequency': 0},
{'id': 20, 'frequency': 0},
{'id': 21, 'frequency': 0},
{'id': 22, 'frequency': 0},
{'id': 23, 'frequency': 0},
{'id': 24, 'frequency': 0},
{'id': 25, 'frequency': 0},
{'id': 26, 'frequency': 0},
{'id': 27, 'frequency': 0},
{'id': 28, 'frequency': 0},
{'id': 29, 'frequency': 0},
{'id': 30, 'frequency': 0},
{'id': 31, 'frequency': 0},
{'id': 32, 'frequency': 0},
{'id': 33, 'frequency': 0},
{'id': 34, 'frequency': 0},
{'id': 35, 'frequency': 0},
{'id': 36, 'frequency': 0},
{'id': 37, 'frequency': 0},
{'id': 38, 'frequency': 0},
{'id': 39, 'frequency': 0},
]
user_003 = [{'id': 0, 'frequency': 0},
{'id': 1, 'frequency': 0},
{'id': 2, 'frequency': 0},
{'id': 3, 'frequency': 1},
{'id': 4, 'frequency': 0},
{'id': 5, 'frequency': 1},
{'id': 6, 'frequency': 0},
{'id': 7, 'frequency': 0},
{'id': 8, 'frequency': 1},
{'id': 9, 'frequency': 0},
{'id': 10, 'frequency': 0},
{'id': 11, 'frequency': 0},
{'id': 12, 'frequency': 0},
{'id': 13, 'frequency': 0},
{'id': 14, 'frequency': 0},
{'id': 15, 'frequency': 0},
{'id': 16, 'frequency': 0},
{'id': 17, 'frequency': 0},
{'id': 18, 'frequency': 2},
{'id': 19, 'frequency': 0},
{'id': 20, 'frequency': 0},
{'id': 21, 'frequency': 0},
{'id': 22, 'frequency': 0},
{'id': 23, 'frequency': 0},
{'id': 24, 'frequency': 0},
{'id': 25, 'frequency': 0},
{'id': 26, 'frequency': 0},
{'id': 27, 'frequency': 0},
{'id': 28, 'frequency': 0},
{'id': 29, 'frequency': 0},
{'id': 30, 'frequency': 0},
{'id': 31, 'frequency': 0},
{'id': 32, 'frequency': 0},
{'id': 33, 'frequency': 0},
{'id': 34, 'frequency': 0},
{'id': 35, 'frequency': 0},
{'id': 36, 'frequency': 0},
{'id': 37, 'frequency': 0},
{'id': 38, 'frequency': 0},
{'id': 39, 'frequency': 0},
]
user_004 = [{'id': 0, 'frequency': 0},
{'id': 1, 'frequency': 0},
{'id': 2, 'frequency': 0},
{'id': 3, 'frequency': 0},
{'id': 4, 'frequency': 0},
{'id': 5, 'frequency': 0},
{'id': 6, 'frequency': 0},
{'id': 7, 'frequency': 0},
{'id': 8, 'frequency': 0},
{'id': 9, 'frequency': 3},
{'id': 10, 'frequency': 1},
{'id': 11, 'frequency': 1},
{'id': 12, 'frequency': 0},
{'id': 13, 'frequency': 0},
{'id': 14, 'frequency': 0},
{'id': 15, 'frequency': 0},
{'id': 16, 'frequency': 0},
{'id': 17, 'frequency': 0},
{'id': 18, 'frequency': 0},
{'id': 19, 'frequency': 0},
{'id': 20, 'frequency': 0},
{'id': 21, 'frequency': 0},
{'id': 22, 'frequency': 0},
{'id': 23, 'frequency': 0},
{'id': 24, 'frequency': 0},
{'id': 25, 'frequency': 0},
{'id': 26, 'frequency': 0},
{'id': 27, 'frequency': 0},
{'id': 28, 'frequency': 0},
{'id': 29, 'frequency': 0},
{'id': 30, 'frequency': 0},
{'id': 31, 'frequency': 0},
{'id': 32, 'frequency': 0},
{'id': 33, 'frequency': 0},
{'id': 34, 'frequency': 0},
{'id': 35, 'frequency': 0},
{'id': 36, 'frequency': 0},
{'id': 37, 'frequency': 0},
{'id': 38, 'frequency': 0},
{'id': 39, 'frequency': 0},
]
user_data = [user_001, user_002, user_003, user_004]
# #计算每个用户吃过的食物范数
def cal_norm(data):
norm = 0;
for i in range(len(data)):
if(data[i]['frequency'] > 0):
norm += 1
return norm
#用户推荐系统 协同过滤
def CF_Algorithm(user_test, area):
Wij = [] #存放用户相似度
#计算用户相似度
user_norm = cal_norm(user_test)
for i in range(0,len(user_data)):
wij = 0
for j in range(0,len(user_data[i])):
wij += user_data[i][j]['frequency']*user_test[j]['frequency']
norm = cal_norm(user_data[i])
wij = wij / sqrt(norm*user_norm)
Wij.append(wij)
print(Wij)
#选取两个相似用户
K = 2
simi_Wij = []
simi_index = []
temp_Wij = Wij.copy();
for i in range(0, K):
if (i > 0 and max(temp_Wij) == simi_Wij[i - 1]):
continue
t = temp_Wij.index(max(temp_Wij))
for j in range(0, len(Wij)):
if(max(temp_Wij) == Wij[j]):
simi_Wij.append(Wij[j])
simi_index.append(j)
del temp_Wij[t]
#计算用户对食物感兴趣程度
Pvi = [] #存放食物感兴趣程度
for i in range(0,len(user_test)):
pvi = 0
for j in range(0, len(simi_index)):
pvi += user_data[simi_index[j]][i]['frequency'] * simi_Wij[j]
Pvi.append(pvi)
#结合地域信息
for i in range(0, len(mealdata)):
if(mealdata[i]['cata'].find(area) > 0):
Pvi[i] += 5 #相同地域加分
print(i)
L = 3 #推荐前三位食物
temp_Pvi = Pvi.copy()
recom_Pvi = []
recom_index = []
for i in range(0, L):
t = temp_Pvi.index(max(temp_Pvi))
if(i > 0 and max(temp_Pvi) == recom_Pvi[i - 1]):
continue
for j in range(0, len(Pvi)):
if (max(temp_Pvi) == Pvi[j]):
recom_Pvi.append(Pvi[j])
recom_index.append(j)
del temp_Pvi[t]
print(recom_index)
return recom_index
area = 'shanxi'
CF_Algorithm(user_test, area)

@ -1,3 +0,0 @@
home = C:\Users\Administrator\AppData\Local\Programs\Python\Python37
include-system-site-packages = true
version = 3.7.3
Loading…
Cancel
Save