盧穎儀,張艷玲
(廣州大學(xué)計算機科學(xué)與教育軟件學(xué)院,廣州 510006)
隨著生活質(zhì)量的提高,如今人們越發(fā)關(guān)心起了“怎么吃”才健康這個問題。然而,不是每個人都是專家,那么,針對沒有研究過健康養(yǎng)生知識的普通人,“怎么吃”就成為了一個值得探討的問題。因此,本文設(shè)計了一款“智能健康養(yǎng)生點菜系統(tǒng)”來為人們提供健康點菜服務(wù)。
近年來,營養(yǎng)學(xué)在國內(nèi)外都得到了很大的發(fā)展,許多國家的營養(yǎng)學(xué)專家或團體先后制定發(fā)布了《膳食營養(yǎng)素參考攝入量(DRIs)》。中國營養(yǎng)學(xué)會于2013年完成了《中國居民膳食營養(yǎng)參考攝入量》的修訂,為中國居民提供了一系列營養(yǎng)成分的每日攝入量的參考標準[1]。根據(jù)該文獻提出的幾個參數(shù)標準,不同屬性的人群可以針對自身情況選擇不同的飲食方式,以養(yǎng)成更為健康的飲食習(xí)慣。另外,合理地攝取營養(yǎng)素、養(yǎng)成健康的飲食習(xí)慣,甚至對某些疾病具有改善病情的作用。曾經(jīng)有學(xué)者在美國康涅狄格州、新澤西州以及華盛頓州針對食管癌與胃癌患者,進行了一項營養(yǎng)素攝入量與發(fā)病率的關(guān)系的研究,研究結(jié)果表明,部分營養(yǎng)素的攝入量與癌癥發(fā)生的風(fēng)險是負相關(guān)的,另外一部分則是正相關(guān)[2]。日本消化外科名醫(yī)濟陽高穗先生經(jīng)過40年臨床研究以及14年追蹤調(diào)查,為癌癥病人獨創(chuàng)了濟陽式食療法,該食療法治療有效率高達64.5%,其中完全治愈病例30例,改善病例106例[3]。中國營養(yǎng)專家李卉與肝病專家、腸胃病專家王偉岸,共同編制了針對肝病患者、腸胃病患者的健康飲食指南,從各個方面提出了針對不同患者的食療法,為不同患者提出了不同的飲食禁忌及建議。數(shù)據(jù)表明,有七成以上的脂肪肝、酒精肝患者通過合理膳食得到了明顯的改善,同樣地,有九成以上的人群通過飲食遠離了腸胃病[4-5]。中國中醫(yī)診斷學(xué)博士、中西醫(yī)結(jié)合臨床博士后王志國則針對糖尿病患者、高血壓患者編寫了飲食指南,詳細介紹了各種食材、菜品及按摩穴位、運動方式,將患者的日常飲食和居家調(diào)養(yǎng)方式以簡明易懂的方式介紹給廣大患者及其家屬。通過日常飲食調(diào)養(yǎng),九成以上的患者的病情都能輕松得到控制[6-7]。
本文通過對文獻[1-7]的研究,設(shè)計了一套健康搭配食材的算法,實現(xiàn)一款由系統(tǒng)進行數(shù)據(jù)處理、直接搭配食材的軟件。再利用關(guān)聯(lián)規(guī)則挖掘算法中的FPGrowth算法對搭配算法進行優(yōu)化,通過關(guān)聯(lián)規(guī)則獲取用戶喜好的食材搭配信息,為用戶提供更好的服務(wù)。
本系統(tǒng)最重要的創(chuàng)新點就是能夠根據(jù)用戶需求直接為用戶推薦一系列搭配在一起較為健康的食材,再由用戶根據(jù)個人喜好從中選擇一部分作為最終菜單。這將大大減少用戶自行選擇食材的復(fù)雜性,為用戶提供便利。
本文結(jié)合文獻[1]提出的幾個參數(shù)以及對文獻[3-7]的研究,得到了4個將會使用到的參數(shù)(參數(shù)名稱為文獻[1]中確定的名稱):推薦攝入量(以下簡稱RNI),適宜攝入量(以下簡稱AI),宏量營養(yǎng)素可接受范圍(以下簡稱AMDR),預(yù)防非傳染性慢性病的建議攝入量(以下簡稱 PI)。
RNI與AI指的是人體每日需要攝取營養(yǎng)素的一個標準,即可以滿足某一特定年齡、性別及生理狀況群體中絕大多數(shù)個體對于某種營養(yǎng)素的需要量的攝入水平。兩者不同的是AI是通過觀察或?qū)嶒炈@得的,當(dāng)研究資料不足,無法推算出RNI時,才使用AI作為參考攝入量。AMDR指的是人體新陳代謝的三大基礎(chǔ)營養(yǎng)素蛋白質(zhì)、脂肪、碳水化合物的理想攝入量范圍。PI是針對某些疾病對不同營養(yǎng)素提出的一個建議攝入量。而本文將文獻[1]中的PI值與文獻[3-7]所得數(shù)據(jù)結(jié)合,得到針對腸胃病、糖尿病、肝病、高血壓或癌癥患者的適宜、禁忌營養(yǎng)素。
以上參數(shù)針對不同年齡層、不同性別、不同生理狀況的人群都有不同的標準,而本系統(tǒng)假設(shè)主要使用人群為18-50歲的健康人群或特殊疾病人群(癌癥、糖尿病、高血壓、腸胃病或肝病患者),將以上參數(shù)的具體值整理歸納并簡化為針對特定年齡層的群體的標準,并將營養(yǎng)素的攝入含量標準定義為高、中、低3個級別。
為了維持生命的需要,人體每日需要均衡攝取一定量的不同營養(yǎng)素。對于蛋白質(zhì)、脂肪、碳水化合物這三種提供能量的營養(yǎng)素而言,人體每日需要攝取足夠的量,才能支持人體新陳代謝的需求。對于其他的維生素和礦物質(zhì),攝取不足或過多都可能導(dǎo)致某些疾病的發(fā)生,或是造成代謝紊亂。
本文綜合RNI值、AI值與AMDR值,總結(jié)了共33種人體需要攝取的營養(yǎng)素及其每日需要攝取的高低值。這33種營養(yǎng)素包括蛋白質(zhì)、脂肪、碳水化合物、多種維生素以及多種礦物質(zhì)。
人體是通過食物來攝取營養(yǎng)素的,而不同的食材所含有的營養(yǎng)素種類或含量都有所不同。本文從文獻3-7]中總結(jié)出共110種食材及其含有的營養(yǎng)素含量,根據(jù)同種類食材之間的對比,將所含營養(yǎng)素的含量定義為“高”、“中”、“低”三個含量標準,從而作為判斷人體每日攝取營養(yǎng)素多少的依據(jù)。
除去營養(yǎng)素含量不同,食物還存在著相生相克的說法。相生,指兩種或多種食物搭配在一起,起到了相輔相成的作用,更具營養(yǎng)價值。相克,指兩種或多種食物搭配起來會破壞營養(yǎng)成分,引起人體不適,造成生病甚至中毒死亡。本文整合了上述110種食材的相生相克食材,以此作為生成推薦菜單的依據(jù)之一。
對于不同疾病而言,都有其飲食禁忌規(guī)范,這種規(guī)范就包括營養(yǎng)素種類及其攝取量。也就是說,每一種疾病都有其適宜或禁忌的營養(yǎng)素。適宜營養(yǎng)素為對該疾病有益的必備營養(yǎng)素,禁忌營養(yǎng)素為可能加重病情的營養(yǎng)素。對于特殊疾病人群,推薦食用富含適宜營養(yǎng)素的食材,反對食用富含禁忌營養(yǎng)素的食材。
本文通過對文獻[1-7]的研究,得到了針對腸胃病、肝病、糖尿病、高血壓以及癌癥這5類疾病的PI值,即這些疾病的適宜營養(yǎng)素集合與禁忌營養(yǎng)素集合,作為生成針對特殊疾病人群的推薦菜單的依據(jù)之一。
系統(tǒng)首先獲取用戶設(shè)置的基本信息,即用餐人數(shù)、患病信息、主要菜品,再根據(jù)一定的算法,由用餐人數(shù)計算出較為合適的葷素菜個數(shù),由患病信息、主要菜品得到營養(yǎng)素、相生相克食材的信息,從而篩選出一系列符合條件的不同種類食材,作為推薦菜單展示給用戶。
根據(jù)用餐人數(shù)的不同,菜品個數(shù)以及葷素搭配也有所不同。此處設(shè)置菜品個數(shù)比用餐人數(shù)多1個,分為素菜和葷菜,具體的食材則由用戶自己決定。計算的流程圖如圖1所示。
圖1是獲取推薦菜品個數(shù)的處理流程圖,推薦菜品個數(shù)比用餐人數(shù)多1個。當(dāng)用餐人數(shù)為單數(shù)時,葷菜與素菜的個數(shù)相同;當(dāng)用餐人數(shù)為雙數(shù)時,設(shè)置葷菜數(shù)量為用餐人數(shù)的一半,而素菜比葷菜多1個。由于本系統(tǒng)推薦的只是一餐中的食材搭配,因此,最終食材的做法,以及具體搭配成菜的食材,還是由用戶自己決定。
圖1 推薦菜品個數(shù)處理
(1)數(shù)據(jù)表的建立及與代碼的映射
要獲得最終的推薦菜單,首先要對食材信息等進行基本的處理。建立一個合理、簡潔的數(shù)據(jù)庫,并在代碼中形成與數(shù)據(jù)表對應(yīng)的簡單Java類[8]。
Android使用的是輕量級的嵌入式關(guān)系型數(shù)據(jù)庫SQLite。在Android中,數(shù)據(jù)庫保存在默認目錄data/data/包名/databases下,程序運行時,將apk中的數(shù)據(jù)庫復(fù)制到該目錄下,再由系統(tǒng)對數(shù)據(jù)庫進行訪問。訪問數(shù)據(jù)庫時,系統(tǒng)首先利用Android提供的類SQLiteOpenHelper,對數(shù)據(jù)庫進行創(chuàng)建、打開等操作,之后則利用SQLiteDatabase類獲取數(shù)據(jù)庫,并對表進行增、刪、改、查等操作[9]。
在本系統(tǒng)的數(shù)據(jù)庫food.db中,一共包含了7張數(shù)據(jù)表。其中,前4張為實體表,后3張為關(guān)系表,如圖2所示。
(1)表 FoodType(FTid、FTname):食物種類表,記錄食物種類的編號與名稱。
(2)表 Food(Fid、Fname、FTid、Fdescription):食物基本信息表,記錄食材的基本信息,包括編號、名稱、種類編號、功效。
(3)表Nutrient(Nid、Nname、Nneed):營養(yǎng)素基本信息表,記錄營養(yǎng)素的編號、名稱、每天需要攝入量(3、2、1 分別表示“高”、“中”、“低”)。
(4)表 Sickness(Sid、Sname):疾病表,記錄疾病的編號與名稱。
(5)表 FN(Fid、Nid、FNcontent):食物營養(yǎng)素關(guān)系表,記錄每個食材對應(yīng)每種營養(yǎng)素的含量高低。
(6)表 SN(Sid、Nid、SNsuit):疾病營養(yǎng)素關(guān)系表,記錄每種疾病的適宜、禁忌營養(yǎng)素。
(7)表Effect(Fid_1、Fid_2、good、effect):相生相克食物表,記錄每種食材的相生相克食材及其產(chǎn)生的影響。
由此,得出了從圖 2(a)到(b)的映射。在圖 2(b)中,每個類的屬性都對應(yīng)其數(shù)據(jù)表中的字段,這樣,在查詢數(shù)據(jù)庫的時候,就可以將查詢到的每一條數(shù)據(jù)包裝成一個對象,在進一步處理時可以被更方便的使用。
(2)對用戶自選食材的處理
用戶在Android端自行選擇一個或幾個主要菜品,添加到自選食材菜單中,由系統(tǒng)對食材進行處理。處理流程如圖3所示。
圖3 用戶自選食材處理流程
(3)對用戶患病信息的處理
用戶在Android端根據(jù)自身情況選擇是否患病、患的是何種病,確認后保存下來,由系統(tǒng)對疾病信息進行處理。
處理流程如圖4所示。
結(jié)果將對圖3與圖4產(chǎn)生的食材列表進行整合,去除重復(fù)元素保存在List中,待前臺調(diào)用。
(4)算法流程
此部分的輸入信息包括用戶自行選擇的一個或幾個主要食材,以及用戶自行選擇的患病列表。本算法對這兩部分的輸入信息進行處理,整合獲取的推薦食材,再去除不推薦的食材,得到最終的推薦菜單。
由類RecommendService對算法進行處理,用到的變量說明如表1所示。
圖4 用戶患病信息處理流程
表1 變量說明表
根據(jù)圖3與圖4,對用戶自選食材的處理過程分為以下幾個步驟。
(1)用戶設(shè)置基本信息
在程序運行時,Android端將彈出兩個對話框,由用戶輸入用餐人數(shù)、選擇是否患病,程序?qū)⒂涗浻脩糨斎氲男畔ⅰ<僭O(shè)用戶設(shè)置用餐人數(shù)為4人,患有糖尿病、腸胃病。
(2)用戶選擇食材
用戶通過選擇食物種類,進入不同種類的食物名稱列表,再選擇具體名稱,查看食物信息,并點擊添加按鈕將該食物添加到用戶自選菜單中。
在進行步驟1、步驟2的時候,系統(tǒng)將保存用戶輸入的信息,在生成推薦菜單時由類RecommendService調(diào)用,整合成List型變量myFoods與sicknesses。
(1)獲取疾病適宜、禁忌營養(yǎng)素:通過調(diào)用SicknessDao接口中的findNutForHelp()方法,設(shè)置其參數(shù)snsuit為1或0,利用HashSet去除重復(fù)元素,最后傳遞到變量nutForHelp、nutForUnHelp中。
推薦食材時,富含禁忌營養(yǎng)素的食材將作為不推薦的部分,若用戶選擇了此部分食材,系統(tǒng)提醒用戶,建議不要繼續(xù)選擇添加。
(2)若用戶并沒有選擇添加食材,即myFoods列表為null,則忽略此步驟;反之,獲取自選食材含有的營養(yǎng)素:用戶的自選食材列表中,可能存在不止一個的食材,而這些食材可能含有相同種類、不同含量的營養(yǎng)素。這里利用HashMap的特性去除重復(fù)的營養(yǎng)素,并更新重復(fù)營養(yǎng)素的含量。nutOfMyFood數(shù)據(jù)類型為Map<Integer,Integer>,其 key值為營養(yǎng)素 id,value值為營養(yǎng)素含量(3、2、1表高、中、低)。當(dāng)兩種食物中含有相同的營養(yǎng)素,將比較其含量,含量相同且其值小于3,則將map中對應(yīng)key的value值加1,若含量不同,則將value值更新為兩者營養(yǎng)素含量中較大的一方。
(3)獲取還需要的營養(yǎng)素:此處認為nutForNeed=人體所需營養(yǎng)素(所有)-nutForUnHelp-nutOfMy-Food。通過接口NutrientDao中的findAll()方法,可獲取數(shù)據(jù)庫中人體每天所需的所有營養(yǎng)素,首先通過List提供的remove()方法去除疾病禁忌營養(yǎng)素,得到剩下的營養(yǎng)素列表及攝取量高低。再比較該列表與nutOfMyFood,若nutOfMyFood中某營養(yǎng)素的含量大于列表中的推薦攝取量,則表示不再需要該營養(yǎng)素,不添加到nutForNeed中;反之,表示需要,添加到nutForN-eed中。
在下面的步驟中,將會找到富含列表nutForNeed中營養(yǎng)素的食材,作為推薦食材的一部分。
(4)獲取富含疾病適宜營養(yǎng)素、疾病禁忌營養(yǎng)素、人體還需要營養(yǎng)素的食物列表:三個列表都通過調(diào)用NutrientDao中的findFoodById()方法得到,輸入數(shù)據(jù)為nutForHelp、nutForUnHelp、nutForNeed,得到變量 food-ForRecOfSic、foodForUnRecOfSic 以 及 foodForRecOf-Need。其中,foodForRecOfSic與 foodForRecOfNeed整合去除重復(fù)元素,得到推薦食物列表foodForRec以及疾病不推薦食物列表foodForUnRecOfSic。
可以看到,在用餐人數(shù)較少,選擇食材較少的情況下,得到的推薦食物非常多,幾乎包含了數(shù)據(jù)庫中保存的所有食材,這是本算法的一個沒有實現(xiàn)好的地方。而富含疾病禁忌營養(yǎng)素的食物,是不推薦用戶食用的。
(5)獲取相生相克食材列表:輸入數(shù)據(jù)為myFoods、foodForRec,根據(jù)接口 FoodDao 中的 findFoodForHelp()方法,設(shè)置其參數(shù)good為1或0,獲取自選食材、推薦食材的相生相克食材列表,輸出為foodForHelpOfMine、foodForUnHelpOfMine、foodForHelpOfRec、foodForUn-HelpOfRec。
此步驟得到的是相生相克食材,在最終的推薦列表中,不會出現(xiàn)相克食材,而且,當(dāng)用戶自己選擇添加食材時,若選擇了已添加食材的相克食材,系統(tǒng)會提醒用戶,并建議不要繼續(xù)選擇添加。
(6)結(jié)果整合:設(shè)置 List<Integer>變量 list暫時存放結(jié)果,將 foodForRec、foodForHelpOfMine以及 food-ForHelpOfRec添加在list中,再去除foodForUnRecOf-Sic、foodForUnHelpOfRec、foodForUnHelpOfMine,得 到結(jié)果,再通過食物種類,將不同種類的食物通過分類ListView,最后顯示在推薦菜單上。
推薦菜單雖然已經(jīng)經(jīng)過篩選,但其生成的食材數(shù)量還是會比較多,而每次由用戶自己再在推薦菜單中選擇,會造成一些不便。因此,對推薦菜單進行優(yōu)化處理。
在數(shù)據(jù)挖掘中的關(guān)聯(lián)規(guī)則領(lǐng)域里,有一個關(guān)聯(lián)分析的非常經(jīng)典的實例——購物籃分析。在超市的購物數(shù)據(jù)中,關(guān)聯(lián)分析可以發(fā)現(xiàn)顧客頻繁地同時購買的商品,通過這種規(guī)則對超市商品進行陳列,會為超市帶來更大的收益[10]。
本文所實現(xiàn)的推薦菜單,其實可以被稱為購物籃事務(wù)(market basket transaction),每一個成功的推薦案例,對應(yīng)一個事務(wù)。通過對成功案例數(shù)據(jù)的關(guān)聯(lián)分析,可以找到食物之間的關(guān)聯(lián)性,即用戶在選擇某樣食材時,會比較喜歡與哪些其他食材進行搭配。
本文使用FP增長算法來發(fā)現(xiàn)頻繁項集與關(guān)聯(lián)規(guī)則。
在關(guān)聯(lián)規(guī)則挖掘算法中,使用支持度和置信度作為關(guān)聯(lián)規(guī)則強度的度量[11]。首先給出FP-Growth算法的幾個定義。
定義1令I(lǐng)={i1,i2,…,id}是輸入數(shù)據(jù)中所有項的集合,T={t1,t2,…,tN}是所有事務(wù)的集合,每個事務(wù)ti所包含的項集都是I的子集。
定義2如果項集X是事務(wù)ti的子集,則稱事務(wù)ti包含項集X。項集X的支持度計數(shù)為:
定義3對于兩個不相交項集X、Y,關(guān)聯(lián)規(guī)則表示形如:X→Y。則該關(guān)聯(lián)規(guī)則的支持度指項集X與Y的的并集在所有事務(wù)中出現(xiàn)的頻繁程度,形式定義如公式(2)所示。置信度則是項集Y在包含X的事務(wù)中出現(xiàn)的頻繁程度,形式定義如公式(3)所示。
FP-Growth算法是關(guān)聯(lián)規(guī)則挖掘算法中對于算法Apriori算法的改進[12]。FP-Growth算法使用FP樹的數(shù)據(jù)結(jié)構(gòu)來組織數(shù)據(jù)。首先計算輸入的事務(wù)數(shù)據(jù)集的每一個項的出現(xiàn)頻數(shù),去除低于最小支持度的項,并將其他頻繁項按頻數(shù)由大到小的順序排列。將事務(wù)數(shù)據(jù)集的每一行數(shù)據(jù)(可以來自數(shù)據(jù)庫)逐個讀入,每一個事務(wù)映射到FP樹中的一條路徑。對于整個事務(wù)數(shù)據(jù)集,系統(tǒng)將逐條讀入數(shù)據(jù),對FP樹進行擴充。FP樹的每一個節(jié)點記錄了一個項的標記以及計數(shù)。在讀入數(shù)據(jù)時,可能會遇到重疊的路徑,此時將路徑上對應(yīng)節(jié)點的計數(shù)值加1。
構(gòu)造出FP樹之后,F(xiàn)P-Growth算法以自底向上的方式探索樹。首先根據(jù)FP樹,找到每個項集作為結(jié)尾的前綴路徑,通過處理每個項集的路徑,得到新的事務(wù)數(shù)據(jù)集,更新前綴路徑中的支持度計數(shù)并刪除非頻繁的項,遞歸構(gòu)建條件FP樹,直到事務(wù)數(shù)據(jù)集為空。最終得到輸入的事務(wù)數(shù)據(jù)集的頻繁模式項,再由此計算出關(guān)聯(lián)規(guī)則及其支持度與置信度。
每個頻繁k-項集可以產(chǎn)生最多2k-2個關(guān)聯(lián)規(guī)則。通過FP-Growth算法產(chǎn)生頻繁模式集后,根據(jù)得出的頻繁模式集,可以得到每個項之間的關(guān)聯(lián)規(guī)則,并根據(jù)公式(2)、(3)計算出各個規(guī)則的支持度與置信度。支持度指的是項集X與Y同時出現(xiàn)在一個事務(wù)中的可能性,置信度指在X存在的條件下,Y產(chǎn)生的概率。
本文以支持度、置信度為主要衡量標準。置信度高表示用戶多次在選擇了某食材的前提下選擇了另外的一種或幾種食材作為配菜,支持度高表示用戶多次選擇了這樣的食材組合,說明用戶再次選擇同樣食材組合的可能性會比較大。
但是,根據(jù)支持度-置信度框架得到的結(jié)論也是具有局限性,可能有意義的模式由于其支持度或置信度較低,會被排出。而隨著用戶使用軟件次數(shù)的增加,輸入到FP-Growth算法的事務(wù)數(shù)據(jù)集也隨著增加,而設(shè)置的支持度閾值也慢慢加大,就會得到一個越來越可靠的結(jié)果。
因此,隨著事務(wù)數(shù)據(jù)集的增多(用戶使用軟件次數(shù)越多,保存在數(shù)據(jù)庫中的訓(xùn)練數(shù)據(jù)越多),最小支持度也會有所變化。
最小支持度=事務(wù)總數(shù)/4
而對于置信度,由于用戶選擇的食材可能會比較分散,系統(tǒng)產(chǎn)生的關(guān)聯(lián)規(guī)則計算出的可能會也會偏小,若最小置信度設(shè)置的值太大,會將大部分關(guān)聯(lián)規(guī)則篩選掉,因此,此處將最小置信度設(shè)置為0.4。
優(yōu)化過程中,系統(tǒng)首先接收到用戶輸入的自選菜單集(即一個項集),判斷該項集的排列組合是否存在于已有關(guān)聯(lián)規(guī)則的條件中。若存在,則將結(jié)果保存在List中,生成推薦菜單時,將結(jié)果輸出,表示用戶可能會喜歡這樣的食材搭配。
本系統(tǒng)選擇Android系統(tǒng)作為軟件的開發(fā)平臺。在開發(fā)軟件過程中,使用Eclipse ADT作為開發(fā)工具,運用Java語言進行開發(fā)。開發(fā)數(shù)據(jù)庫時,則使用SQLite3作為數(shù)據(jù)庫管理系統(tǒng)。
測試時,首先使用Eclipse的虛擬機進行測試,完成后,再在不同型號、系統(tǒng)的真機上進行測試。測試時使用的機型與測試結(jié)果如表2所示:
表2 測試機型與測試結(jié)果表
打開應(yīng)用界面,用戶首先通過對話框設(shè)置用餐人數(shù)以及患病信息,如圖5、圖6所示。
圖5 設(shè)置患病信息對話框
圖6 設(shè)置用餐人數(shù)對話框
此處假設(shè)用餐人數(shù)有4人,其中一個患有腸胃病,另外一個患有糖尿病。進入系統(tǒng)后,在導(dǎo)航界面可以看到用戶設(shè)置的基本信息,通過導(dǎo)航進入推薦菜單頁,如圖7、圖8所示。用戶可以直接選擇推薦菜單里的食材進行添加,或者通過導(dǎo)航欄返回食材的全部分類頁,查看所有種類的所有食材,再根據(jù)自己的喜好來添加食材。
圖7 導(dǎo)航頁
圖8 推薦菜單
在用戶添加食材的過程中,如果選擇了其患病不推薦食用的食材,或者是已選擇的食材的相克食材,系統(tǒng)會提示用戶,并詢問是否繼續(xù)添加。
添加食材完畢,用戶可以選擇返回,通過導(dǎo)航進入“我的菜單”,或者通過食材信息頁、食材列表頁右上角的更多按鈕,點擊進入“我的菜單”。在“我的菜單”中,用戶可以查看自己所添加的食材,按需求可進行批量刪除操作。
當(dāng)用戶退出應(yīng)用時,系統(tǒng)將在數(shù)據(jù)庫中自動保存“我的菜單”中的食材,作為一次點菜的成功案例。在用戶下一次使用軟件時,通過FP-Growth算法挖掘關(guān)聯(lián)規(guī)則,獲取用戶可能喜歡的與已選食材搭配的食材,在推薦菜單中顯示給用戶。
本文主要研究基于Android的智能健康養(yǎng)生點餐軟件,以及在完成推薦菜單的基礎(chǔ)上,基于關(guān)聯(lián)規(guī)則挖掘算法FP-Growth的優(yōu)化分類方法。本文首先分析了營養(yǎng)素、食材、疾病與人體的關(guān)系,依據(jù)養(yǎng)生知識確立了推薦菜單的生成過程,其影響因素有五個方面:人體每天需要攝取的營養(yǎng)素成分高低、用戶是否患有疾病或疾病適宜禁忌營養(yǎng)素、用戶自己選擇的主要食材、食材之間的相生相克、用餐人數(shù)。為了使用戶得到更好的體驗,本文將每次成功的推薦菜單保存為事務(wù)數(shù)據(jù)集,通過FP-Growth算法進行關(guān)聯(lián)規(guī)則的挖掘,最后以關(guān)聯(lián)規(guī)則及其支持度、置信度為基礎(chǔ),用戶再次點菜時,通過查詢是否存在關(guān)聯(lián)規(guī)則的條件為用戶自選菜單,篩選出對應(yīng)的結(jié)果,對推薦菜單進行優(yōu)化。
參考文獻:
[1]程義勇.《中國居民膳食營養(yǎng)素參考攝入量》2013修訂版簡介[J].營養(yǎng)學(xué)報,2014,36(4):313-317.
[2]Mayne S T,Risch H A,Dubrow R,et al.Nutrient Intake and Risk of Subtypes of Esophageal and Gastric Cancer[J].Cancer Epidemiology Biomarkers&Prevention,2001,10(10):1055-1062.
[3]濟陽高穗著,魯雯霏譯.癌細胞害怕我們這樣吃[M].南昌:江西科學(xué)技術(shù)出版社,2015.1.
[4]李卉,王偉岸.肝病害怕我們這樣吃[M].南昌:江西科學(xué)技術(shù)出版社,2015.5.
[5]李卉,王偉岸.腸胃病害怕我們這樣吃[M].南昌:江西科學(xué)技術(shù)出版社,2015.5.
[6]王志國.糖尿病害怕我們這樣吃[M].天津科學(xué)技術(shù)出版社,2015.
[7]王志國.高血壓害怕我們這樣吃[M].天津科學(xué)技術(shù)出版社,2015.
[8]李興華.Java核心技術(shù)精講[M].北京:清華大學(xué)出版社,2013.10
[9]唐磊.淺談SQLite數(shù)據(jù)庫技術(shù)在Android平臺的應(yīng)用[J].電子世界,2014(9):12-13.
[10]Han J,Kamber M.Data Mining Concept and Techniques[M].2006.
[11](美)譚,(美)斯坦巴赫著.數(shù)據(jù)挖掘?qū)д揫M].范明等譯.北京:人民郵電出版社,2006.5。
[12]Sidhu S,Kumar Meena U,Nawani A,et al.FP Growth Algorithm Implementation[J].International Journal of Computer Applications,2014,93(8):6-10.
[13]呂雪驥,李龍澍.FP-Growth算法MapReduce化研究[J].計算機技術(shù)與發(fā)展,2012(11):123-126