喻 兵 郝梓杰 羅裕升 朱珍民*
1(湘潭大學(xué) 湖南 湘潭 411105)2(中國科學(xué)院計算技術(shù)研究所 北京 100080)
隨著社會不斷進步與發(fā)展,人們的生活質(zhì)量不斷提高,健康話題越來越被人們所關(guān)注。然而,不良的生活方式是導(dǎo)致慢性非傳染性疾病不斷增加的重要因素,其中,飲食方面尤為突出。因此,注重飲食的合理性和健康性,才能確保和維持人體中必需營養(yǎng)素的平衡性,避免慢性病的發(fā)生[1],從而提高人的壽命和健康水平。
如何為人們提供合理的飲食方案便成為世界各地營養(yǎng)學(xué)家的職責(zé)。如今,由于營養(yǎng)學(xué)家人數(shù)有限且行醫(yī)水平參差不齊,人們想要便捷地了解自己的飲食狀態(tài)并不方便。但是隨著移動互聯(lián)網(wǎng)產(chǎn)業(yè)的興起,各種推薦系統(tǒng)應(yīng)運而生[2],作用于不同應(yīng)用的場景。最近幾年也有學(xué)者嘗試將推薦算法應(yīng)用在飲食推薦中,例如:2012年,北京大學(xué)的孔令愷等[3]在傳統(tǒng)的協(xié)同過濾基礎(chǔ)上引入遺忘曲線和修改權(quán)重來修改菜品的統(tǒng)計值,然后運用相關(guān)算法計算出用戶之間的相似度,從而以相似用戶的下單數(shù)據(jù)當(dāng)作該用戶的推薦依據(jù);同年,北京大學(xué)的陳曦等[4]充分利用智能手機感知周圍情境信息的功能,設(shè)計了一個基于Android移動終端的結(jié)合地理位置、時間、美食特點和用戶個人信息的推薦系統(tǒng);2015年,電子科技大學(xué)的趙恒等[5]提出了一種基于LBS的本地美食推薦系統(tǒng),該系統(tǒng)基于地理位置和混合推送策略為用戶進行推薦;2016年,盛實旺等[6]基于改進的Apriori算法進行用戶的飲食愛好分析,實現(xiàn)個性化推薦。
近幾年飲食推薦的研究,基本是基于內(nèi)容、關(guān)聯(lián)規(guī)則和協(xié)同過濾的推薦,旨在挖掘用戶的喜好并以提高點擊轉(zhuǎn)化率和商業(yè)價值為目的,在健康飲食推薦方面的研究依然十分匱乏。故此,本文提出一種合理有效的多維度飲食推薦方法,從而彌補在健康飲食推薦方面的不足。
本文菜品數(shù)據(jù)集包含中華菜系、疾病調(diào)養(yǎng)食譜、功能性調(diào)理膳食、人群營養(yǎng)膳食等幾大類菜譜。經(jīng)過格式整理,菜品包含多個字段。將菜名、圖片、制作方法、制作提示、口感、推薦食用時間、營養(yǎng)解析、食物相克作為普通字段,這些字段無實際意義,僅僅作為菜品的展示信息;而工藝、口味、菜系、功效、主料、輔料、調(diào)料、營養(yǎng)成分作為核心字段,這些字段對用戶的飲食分析起到重要的作用,需要進行特征處理。本文重點在于判斷用戶的飲食是否符合健康標(biāo)準(zhǔn),為了保證菜品數(shù)據(jù)能最大程度地反映用戶飲食結(jié)構(gòu),需要對菜品數(shù)據(jù)進行預(yù)處理與特征構(gòu)造。
通過數(shù)據(jù)統(tǒng)計分析,發(fā)現(xiàn)不同菜品的質(zhì)量存在一定的差異,這可能導(dǎo)致各個成分含量存在較大的波動。為了提高本文推薦算法的準(zhǔn)確率,故對所有數(shù)值型特征進行數(shù)據(jù)標(biāo)準(zhǔn)化預(yù)處理。
由于菜品數(shù)據(jù)在特征空間內(nèi)存在較多離群點,導(dǎo)致空間分布不均勻并且各個特征維度有不同的量綱。故此,本文對數(shù)值型特征先進行l(wèi)n函數(shù)平滑,再對平滑后的值進行Z-Score標(biāo)準(zhǔn)化處理,能讓數(shù)值特征的分布更加均勻,并且對各個數(shù)值型特征的量綱進行了統(tǒng)一。
原始菜品數(shù)據(jù)集中,菜品質(zhì)量不同導(dǎo)致營養(yǎng)成分含量不同,僅對“營養(yǎng)成分含量”特征進行統(tǒng)計無法刻畫菜品營養(yǎng)結(jié)構(gòu)信息。為了消除菜品質(zhì)量對營養(yǎng)結(jié)構(gòu)分析的影響,本文采用1-范數(shù)正則化對營養(yǎng)成分含量特征進行正則化,目的在于獲取每個成分含量所占有營養(yǎng)成分含量的百分比,從而得到菜品營養(yǎng)結(jié)構(gòu)的信息。由于營養(yǎng)元素分為宏量營養(yǎng)元素和微量營養(yǎng)元素,而微量元素含量的變化必然會被宏量元素含量掩蓋,導(dǎo)致模型無法捕捉到微量元素的特征。為了解決宏量元素與微量元素含量差距過大的問題,使用Max-Min標(biāo)準(zhǔn)化,再正則化,能夠更準(zhǔn)確地刻畫菜品的營養(yǎng)成分。
在CTR預(yù)估場景中,為了提高模型預(yù)測的準(zhǔn)確率,常常將數(shù)值型特征轉(zhuǎn)換為離散型特征,主要原因是特征離散化后對特征的表達更加合理。比如對于年齡特征,可能將20~30歲區(qū)間作為同一個離散值更合理,因為人們不會因為增加了1歲而改變興趣愛好,同時也會增強模型對數(shù)據(jù)異常值的魯棒性。
本文對用戶的口味偏好進行挖掘,需要將“調(diào)料成分含量”做進一步的特征構(gòu)造。為了對用戶口味偏好進行更好的建模,本文采用GBDT算法[7]對“調(diào)料成分含量”特征進行離散化,將原始的調(diào)料成分特征作為GBDT的輸入,口味特征作為label訓(xùn)練模型,最終得到150個特征個數(shù)。GBDT特征構(gòu)造的原理步驟如下:
(1) 利用菜品原始調(diào)料成分作為特征和口味作為訓(xùn)練標(biāo)簽,進行GBDT特征訓(xùn)練;
(2) 訓(xùn)練完成后,將訓(xùn)練樣本輸入GBDT中,得到樣本在每棵樹的葉子節(jié)點的編號,再對該編號進行one-hot編碼;
(3) 將第二步得到的所有one-hot編碼拼接成一組新的離散化特征(特征長度為所有葉節(jié)點的個數(shù))。
通過數(shù)據(jù)預(yù)處理和特征離散化,得到了菜品數(shù)據(jù)集的全部特征,共分為7組特征,其中前3個特征組為原始特征,4、5特征組為經(jīng)過平滑和標(biāo)準(zhǔn)化后的數(shù)值型特征,6特征組為營養(yǎng)成分含量歸一化和正則化后的特征值,7特征組為調(diào)料成分經(jīng)過GBDT模型離散化后的值,具體的特征列表如表1所示。
表1 菜品特征列表
對菜品進行數(shù)據(jù)分析,能夠?qū)⒉似愤@個抽象的事物進行數(shù)字化或結(jié)構(gòu)化的表征,使推薦算法能有效地猜測用戶對菜品的所需和所愛。
前面簡單提到,大部分學(xué)者的飲食推薦工作主要以結(jié)合手機定位、社交網(wǎng)絡(luò)等多維度的外部特征,從而最大化用戶的點擊率。與以最大化點擊率為目標(biāo)的個性化推薦算法不同,本文推薦算法是以調(diào)節(jié)用戶飲食結(jié)構(gòu)為主,口味挖掘為輔。因此,算法并未涉及到協(xié)同過濾等[8]傳統(tǒng)的推薦技術(shù),因為以最大化點擊率為目標(biāo)的推薦算法很大概率不符合健康標(biāo)準(zhǔn)。本文旨在基于用戶畫像、飲食記錄、即時情境3種方式對用戶進行飲食推薦,從而使用戶飲食結(jié)構(gòu)合理化。
用戶畫像就是根據(jù)用戶的人口屬性、偏好習(xí)慣和行為信息而抽象出來的標(biāo)簽化畫像[9]。基于該類特征可以準(zhǔn)確定義不同用戶的營養(yǎng)成分含量合理攝入?yún)^(qū)間的差異性。本文將用戶畫像定義為年齡、性別、身高、體重、過敏源、人群、疾病7個方面,其中人群包含7類:普通人群、老人、孕婦、乳母、嬰兒、幼兒、青少年;疾病包含6類:高血壓、高血脂、糖尿病、冠心病、脂肪肝、肝硬化?;谟脩舢嬒竦耐扑]方式是確定性算法,可以形式化為:
y1=H(Df,Cf)
(1)
y2=G(y1,Qf,BMI)
(2)
y3=G(y2,Af)
(3)
式中:Df表示疾病特征,Cf表示人群特征,Qf表示歷史攝入量,BMI表示體質(zhì)指數(shù),Af表示人體過敏原。通過形式化的表達可知,本推薦方式可分為3個步驟進行,從而產(chǎn)生最終的推薦列表y3,算法步驟可描述如下:
(1) 根據(jù)用戶的疾病特征和人群特征的營養(yǎng)成分合理攝入?yún)^(qū)間進行菜品過濾,得到列表y1;
(2) 先對用戶近期的菜品進行未達標(biāo)和超標(biāo)元素的統(tǒng)計,再對未達標(biāo)和超標(biāo)列表對y1進行不滿足條件菜品過濾,然后根據(jù)BMI指數(shù)對脂肪含量極端值進行過濾,得到列表y2;
(3) 最后根據(jù)主料、輔料、調(diào)料成分含量,將推薦列表y2中具有過敏原的菜品數(shù)據(jù)進行過濾,產(chǎn)生最終推薦給用戶的菜品列表y3。
通過上述算法,以用戶畫像為依據(jù),判斷用戶近期飲食是否符合該畫像的膳食指南,從而可以推薦最滿足該用戶身體狀態(tài)的菜品列表。
飲食記錄是用戶在本實驗平臺上操作的所有行為記錄,比如食用、喜歡、不喜歡等,該類特征可以有效挖掘用戶的飲食偏好,從而判斷用戶的營養(yǎng)結(jié)構(gòu)是否合理并且挖掘出用戶喜愛的口味。
2.2.1基于營養(yǎng)結(jié)構(gòu)的推薦算法
在營養(yǎng)結(jié)構(gòu)挖掘中,聚類與分類的不同在于,聚類所要求劃分的類是未知的,根據(jù)信息相似度進行信息聚類;而分類是每個樣本數(shù)據(jù)已有類標(biāo)識,然后將該對象歸為對應(yīng)的類中。因此,本文通過聚類的方法將包含相似營養(yǎng)成分的菜品聚在相同的簇內(nèi),達到分類的效果。算法步驟如下:
(1) 將所有菜品數(shù)據(jù)按表2中的4、6特征組進行聚類,簇數(shù)可以調(diào)整;
(2) 判定該用戶最近K次食用的菜品,統(tǒng)計其簇數(shù)分布;
(3) 推薦該用戶食用簇數(shù)最少的簇內(nèi)食物,目前采用隨機推薦。
2.2.2基于用戶口味的推薦算法
VDM定義如下:令mu,a表示在屬性u上取值為a的樣本數(shù),mu,a,i表示第i個樣本簇中屬性u上取值為a的樣本數(shù),k為樣本簇數(shù),則屬性u上兩個離散值a與b直接的VDM距離公式如下:
(4)
類VDM定義如下:對于每個用戶來說,mu,a表示所有食用的食物中屬性u上取值為a的菜品數(shù),mu表示所有食用的食物中具有屬性u的菜品數(shù),所以類VDM距離公式如下:
(5)
基于上述的類別型特征距離計算方法,再結(jié)合傳統(tǒng)的數(shù)值型特征距離計算方法,便可以對菜品數(shù)據(jù)進行距離計算,從而挖掘出相似口味的食物。口味挖掘算法步驟如下:
(1) 將所有菜品數(shù)據(jù)特征進行表示,查詢該用戶最近的M次飲食記錄,利用本文提出的類別型距離計算公式計算各個類別間的距離;
(2) 在全集菜品中,以距離遠近為標(biāo)準(zhǔn)選擇口味最相似的N個菜品進行推薦。
上述兩種算法都是依據(jù)用戶的飲食記錄,產(chǎn)生不同的推薦列表,分別滿足用戶營養(yǎng)均衡需求和用戶口味偏好的需求。
前兩種推薦算法主要側(cè)重于用戶屬性和歷史記錄推斷“用戶應(yīng)該吃什么”和“用戶可能愛吃什么”。但是依據(jù)靜態(tài)特征所做出的判斷,往往沒有考慮到即時情境的影響。本文將此時的時間、此時的運動消耗作為特征,提出一種即時情境的推薦方式。
本文將飲食時間劃分成早、中、晚3個時間段,運動量劃分成低、中、高3個等級(基于運動步數(shù)劃分),并且用戶的飲食熱量含量應(yīng)該隨著時間中、早、晚和運動量高、中、低依次遞減。將用戶的即時狀態(tài)編碼成兩位的字符,例如“00”代表此時是晚上并且用戶運動量低,需求等級為0,此時需要最低熱量的食物即可;“22”代表此時是中午并且運動量高,需求等級為4,此時需要最高熱量的食物比較合適。該推薦算法步驟如下:
(1) 獲取用戶特征、用戶近期飲食的菜品以及用戶飲食的行為;
(2) 依據(jù)用戶特征、用戶近期飲食的菜品特征,采用上述用戶畫像推薦算法得到推薦列表y1;
(3) 依據(jù)用戶近期飲食行為,采用上述飲食記錄推薦算法得到推薦列表y2;
(4) 獲取用戶當(dāng)前時間與運動步數(shù),將用戶的即時狀態(tài)進行編碼;
(5) 根據(jù)用戶的編碼,依次在y1和y2列表中返回與用戶熱量需求等級最相近的菜品。
該推薦方法與前兩種推薦方法屬于遞進關(guān)系,即在前兩種推薦列表的基礎(chǔ)上考慮了即時情境對飲食的影響,將時間和用戶運動量特征作為外部特征對前兩種推薦列表進行重排序,產(chǎn)生菜品列表。
依據(jù)營養(yǎng)學(xué)會針對不同疾病和人群的膳食營養(yǎng)指南,制訂了各個營養(yǎng)攝入量規(guī)則。其中不同人群、不同病種的膳食指南可簡化抽象如表2所示。
表2 不同人群和不同疾病膳食指南概括
本實驗的具體步驟如下:
(1) 隨機模擬不同的用戶畫像;
(2) 根據(jù)模擬用戶的疾病、人群特征在全集菜品中初步篩選出所有符合該用戶特征的菜品;
(3) 根據(jù)該用戶的近期飲食記錄和BMI值,并按規(guī)則對菜品進行二次篩選;
(4) 過濾過敏源,產(chǎn)生最終符合條件的菜品進行推薦。
基于用戶畫像的推薦是基于領(lǐng)域知識設(shè)定規(guī)則的推薦。本研究共進行了50次不同用戶畫像的隨機模型實驗,通過對各類用戶畫像的推薦菜品進行原始營養(yǎng)元素含量數(shù)據(jù)的均值統(tǒng)計,并與全集菜品的相關(guān)營養(yǎng)元素含量的均值統(tǒng)計值進行對比;針對不同疾病和不同人群,模擬用戶1和用戶2,假設(shè)用戶1是一位患有高血壓的孕婦,用戶2是一位患有高血壓的老人;分別列舉兩組推薦菜品的統(tǒng)計信息,統(tǒng)計其相關(guān)營養(yǎng)元素含量進行比較,實驗結(jié)果如圖1和圖2所示。
圖1 高血壓推薦菜品與全集菜品的營養(yǎng)元素對比
圖2 高血脂推薦菜品與全集菜品的營養(yǎng)元素對比
根據(jù)BMI指數(shù)對菜品數(shù)據(jù)中“脂肪含量”高于或低于一定閾值的菜品進行過濾,從而進一步產(chǎn)生合理的推薦列表。針對上述高血壓孕婦的案例,模擬用戶3和用戶4,其BMI指數(shù)分別高于正常值和低于正常值,對比營養(yǎng)元素變化。實驗結(jié)果如圖3和圖4所示。
圖3 雙重條件改變時營養(yǎng)元素含量變化
圖4 BMI指標(biāo)變化時營養(yǎng)元素含量變化
將圖1、圖2與表2作對比可知,表2的所有指標(biāo),均符合膳食指南建議,從而證明了本推薦算法對于單一人群或疾病特征具有有效性。
由圖3可知,在雙重條件控制下,本算法依然可以返回相對合理的菜品推薦列表。在關(guān)鍵營養(yǎng)元素上,由于人群特征的不同而導(dǎo)致其含量不同,例如“葉酸含量”和“碘含量”在高血壓孕婦推薦菜品相比于高血壓老人推薦菜品會有一倍以上的提升,同時也能保證“纖維素含量”、“維生素含量”等均保持較高的水平。
由圖4可知,在BMI指數(shù)過高時,推薦菜品的平均脂肪含量會相對下降,而在BMI指數(shù)過低時,推薦菜品的平均脂肪含量會相對上升,并且對于疾病和人群特征的關(guān)鍵營養(yǎng)元素的含量沒有發(fā)生太大變化,依然符合膳食指南標(biāo)準(zhǔn),從而證明了本推薦策略的有效性。
3.2.1營養(yǎng)結(jié)構(gòu)實驗分析
本文根據(jù)用戶最近飲食記錄,對菜品進行聚類分析。聚類性能度量的方法大致分為兩類:(1) 人工標(biāo)注的外部指標(biāo);(2) 內(nèi)部指標(biāo)。因為本數(shù)據(jù)集中的所有菜品數(shù)據(jù)均缺少營養(yǎng)結(jié)構(gòu)標(biāo)注,所以本研究采用內(nèi)部指標(biāo)作為聚類算法效果的度量指標(biāo)。假設(shè)某聚類算法對數(shù)據(jù)集的簇劃分為C={C1,C2,…,Ck},則有如下定義:
(6)
diam(C)=max1≤i≤j≤|C|dist(xi,xj)
(7)
dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj)
(8)
dcen(Ci,Cj)=dist(μi,μj)
(9)
式中:dist()函數(shù)代表兩個實例之間的距離計算公式;μ代表簇C的中心點,avg(C)表示簇C內(nèi)樣本間的平均距離,diam(C)表示簇C內(nèi)樣本間的最遠距離,dmin(Ci,Cj)表示簇Ci和Cj最近樣本間的距離,dcen(Ci,Cj)表示簇Ci和Cj中心點間的距離。基于上式,可以導(dǎo)出下面兩個常用的聚類性能度量內(nèi)部指標(biāo),DBI值越小越好,DI值越大越好。
1) DB指數(shù)DBI(Davies-Bouldin Index):
(10)
2) Dunn指數(shù)DI(Dunn Index):
(11)
本文分別考慮K-means[10]和DBSCAN[11]兩種不同的聚類算法。K-means算法是一種無監(jiān)督的聚類算法,它被稱為K-平均,由于聚類效果不錯,被廣泛使用。DBSCAN算法是一種基于密度空間的聚類方法,它不易受到噪聲樣本的干擾,可以有效地分離出噪聲樣本。本文將兩種算法的聚類簇數(shù)控制在3、5、7個,進行度量指標(biāo)的對比。實驗結(jié)果如圖5和圖6所示。
圖5 K-means和DBSCAN在DBI指標(biāo)對比
圖6 K-means和DBSCAN在DI指標(biāo)對比
當(dāng)cluster=5時K-means算法的DBI指數(shù)略差于DBSCAN,其余指標(biāo)均優(yōu)于DBSCAN算法。故本文采用K-means算法進行營養(yǎng)結(jié)構(gòu)分析,進而為用戶進行合理的膳食推薦。本文的特征達到60維,無法直接進行可視化效果展示,故經(jīng)PCA降維,cluster=5時,K-means與DBSCAN的聚類效果比較如圖7所示,左側(cè)為K-means效果,右側(cè)為DBSCAN效果。
圖7 K-means和DBSCAN的聚類效果展示
3.2.2口味偏好實驗分析
本文采用類VDM計算特征距離的相似度,挖掘出與用戶飲食記錄最相似的食物進行推薦。本文共進行了50組模擬實驗,分別對類VDM距離計算相似度和傳統(tǒng)歐式距離計算相似度進行對比。每次實驗輸入一組菜品代表用戶歷史飲食記錄(分別設(shè)置歷史記錄長度為1、3、5進行實驗),兩種相似度計算方法分別返回最相似的Top10菜品,并由5位志愿者對結(jié)果進行標(biāo)注,準(zhǔn)確率如圖8所示。
圖8 兩種距離計算方式準(zhǔn)確率對比
由實驗結(jié)果可知,在僅考慮1個歷史飲食記錄時,本方法和基于歐氏距離的計算方法沒有任何差別,返回相同的結(jié)果。但隨著歷史記錄的增長,本方法在類別型特征相似度計算上相比與原始方法有了較大優(yōu)勢,在歷史長度為5時,準(zhǔn)確率可以達到67.4%,故驗證了本方法的有效性。
在快節(jié)奏生活和高強度工作下,人們的健康狀態(tài)難以得到保障,本文在充分掌握了各種人群膳食指南的基礎(chǔ)上,利用多種數(shù)據(jù)處理方法、GBDT自動特征構(gòu)造和不同聚類算法等,提出了一種基于用戶畫像、飲食記錄、即時情境的飲食推薦算法,旨在幫助人們改善飲食結(jié)構(gòu),合理化不同營養(yǎng)元素的攝入量,從而達到健康飲食的目的。本文存在的不足在于用戶的飲食記錄行為數(shù)量不足,缺少線上用戶飲食數(shù)據(jù)進行對比。本文后續(xù)工作將使實驗平臺上線獲取更多的用戶飲食數(shù)據(jù)進行迭代優(yōu)化,使得推薦效果更加準(zhǔn)確;基于用戶畫像的推薦和基于飲食記錄的推薦相結(jié)合,對畫像產(chǎn)生的推薦列表根據(jù)口味偏好進行排序;在基于即時情境的推薦方面做很多深入的研究,例如可以與無創(chuàng)生理指標(biāo)檢測方面的算法進行融合,挖掘更多的即時情境等。本文具有重要的實際應(yīng)用價值,可幫助人們改善飲食結(jié)構(gòu)、預(yù)防慢性疾病的發(fā)生,提高全民的健康素養(yǎng)。