許玉龍,王忠義,呂雅麗,王林景,王 昂,朱紅磊,宋 婷
(1. 河南中醫(yī)藥大學(xué)信息技術(shù)學(xué)院 鄭州 450046;2. 香港科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)系 香港西貢清水灣)
隱結(jié)構(gòu)分析是香港科技大學(xué)張連文教授為研究中醫(yī)藥提出的專用方法[1,2],屬于無監(jiān)督學(xué)習(xí)的一種,底層原理是貝葉斯網(wǎng)絡(luò)及概率圖模型。隱結(jié)構(gòu)在分析中醫(yī)藥數(shù)據(jù)時(shí),是基于癥狀等顯式數(shù)據(jù)的概率同現(xiàn),從一組癥狀顯變量出發(fā),推導(dǎo)分析出隱藏知識(shí),對(duì)隱含的知識(shí)進(jìn)行中醫(yī)詮釋,得到相應(yīng)的隱變量(證候),整個(gè)學(xué)習(xí)過程契合于中醫(yī)大夫的診病過程,較適宜研究中醫(yī)證候問題[3-6,14]?,F(xiàn)有研究成果表明[7,8,12,13,15,16],該方法已成功用于分析多種疾病的證候數(shù)據(jù),并取得較好效果。
在提出隱結(jié)構(gòu)方法的同時(shí),張教授團(tuán)隊(duì)開發(fā)了用于隱結(jié)構(gòu)模型學(xué)習(xí)的單機(jī)版軟件Lantern,即孔明燈[9]。該軟件實(shí)現(xiàn)了隱結(jié)構(gòu)模型的學(xué)習(xí)過程,包含了多種模型學(xué)習(xí)的方法,被國內(nèi)外相關(guān)研究者廣泛使用。該方法在學(xué)習(xí)模型時(shí),底層維護(hù)的是一個(gè)特殊貝葉斯網(wǎng)絡(luò),使用期望最大(EM, Expectation-Maximization)等算法學(xué)習(xí)出整個(gè)網(wǎng)絡(luò)結(jié)構(gòu),以及網(wǎng)絡(luò)中所有癥狀顯變量節(jié)點(diǎn)和隱變量節(jié)點(diǎn)的條件概率表,并利用貝葉斯評(píng)分規(guī)則進(jìn)行選擇最優(yōu)模型及參數(shù),這些計(jì)算過程都屬于NP(Non-deterministic Polynomial)難問題。所以,單機(jī)版孔明燈軟件在模型學(xué)習(xí)時(shí),存在計(jì)算時(shí)間長、獨(dú)占電腦資源等不足,特別是當(dāng)分析的數(shù)據(jù)較大時(shí),需要幾十天的時(shí)間才能學(xué)習(xí)出模型。
因此,為解決單機(jī)版孔明燈軟件在計(jì)算能力上存在的不足,在張教授及其團(tuán)隊(duì)的指導(dǎo)下,我們基于單機(jī)版設(shè)計(jì)開發(fā)了生成隱結(jié)構(gòu)模型的中醫(yī)藥數(shù)據(jù)分析網(wǎng)絡(luò)平臺(tái),即孔明燈網(wǎng)絡(luò)版。該網(wǎng)絡(luò)版不需要下載客戶端程序,采用分布式云服務(wù)器方式,三個(gè)計(jì)算節(jié)點(diǎn)能夠并發(fā)支持200 個(gè)用戶同時(shí)使用,并實(shí)現(xiàn)7×24 h 全天候計(jì)算,在模型學(xué)習(xí)的效率上較單機(jī)版提升5 倍以上。同時(shí)網(wǎng)絡(luò)平臺(tái)還具有業(yè)務(wù)日志、登錄日志、監(jiān)控管理等多個(gè)附加功能,較大地方便了用戶和管理人員。
孔明燈單機(jī)版軟件是專用的隱結(jié)構(gòu)模型學(xué)習(xí)軟件[9],被國內(nèi)外隱結(jié)構(gòu)及中醫(yī)藥研究者們廣泛使用,自發(fā)布以來,軟件經(jīng)歷了多次更新,最新版本是2018 年發(fā)布的5.0 版,我們有幸與香港科技大學(xué)張教授團(tuán)隊(duì)合作,參與了5.0 版本的更新及研究工作[10,11]。下面簡要介紹5.0版本的主要功能變化。
1)雙步隱樹分析,包含 BI 算法(Bridge Island)和LTM-EAST 算 法(Latent Tree Model - Extension Adjustment Simplification until Termination algorithm)。BI 算法適合初步分析,由于采用貪心算法計(jì)算求出局部最優(yōu)解,所以運(yùn)行時(shí)間較短,得到的隱樹質(zhì)量一般;LTM-EAST 算法適合正式分析,它對(duì)所有的可能解進(jìn)行遍歷求出全局最優(yōu),運(yùn)行時(shí)間較長,得到隱樹質(zhì)量較高。需要說明的是,上述BI和LTM-EAST算法運(yùn)算時(shí),一般接收的是所有癥狀(屬性)數(shù)據(jù),得到模型反映整體所有屬性,這是第一步。然后,第二步再根據(jù)醫(yī)學(xué)知識(shí),挑選反映某側(cè)面的癥狀進(jìn)行綜合聚類,得到最終三層模型,進(jìn)行后續(xù)的模型詮釋、建立辨證規(guī)則等操作。
2)隱類模型分析(LCM,Latent Class Model)。隱類分析得到的是一個(gè)隱變量的兩層隱樹模型,該方法已被廣泛應(yīng)用于西醫(yī)疾病的診斷,并取得了較好的成果[7,8]。
3)單 步 隱 樹 分 析(UC-LTM,Unidimensional clustering-Latent Tree Model)。稱為單維聚類的隱樹分析,該方法接收的是根據(jù)醫(yī)學(xué)知識(shí)挑選好的某些特定癥狀(屬性)數(shù)據(jù),分析之后不需再綜合聚類,直接得到最終的三層隱樹模型。依據(jù)得到模型可進(jìn)行后續(xù)的模型詮釋、建立辨證規(guī)則等操作。
1)建立辯證規(guī)則功能。對(duì)于得到的模型,選擇隱變量節(jié)點(diǎn),點(diǎn)擊右鍵選擇“建立辨證規(guī)則”,讀入模型對(duì)應(yīng)的數(shù)據(jù)文件。然后輸入規(guī)則名稱,最后點(diǎn)擊“導(dǎo)出規(guī)則”,將自動(dòng)把準(zhǔn)確度高的規(guī)則導(dǎo)出為csv 文件在數(shù)據(jù)的同一目錄下。假設(shè)規(guī)則名為氣虛證,點(diǎn)擊“導(dǎo)出規(guī)則”后,導(dǎo)出規(guī)則文件如表1 所示,規(guī)則為多行2列數(shù)據(jù),第一行第一列元素為規(guī)則名,第一行第二列元素為規(guī)則閾值。從第二行開始,為癥狀名和分值。
表1 導(dǎo)出的辯證規(guī)則表
2)使用規(guī)則進(jìn)行辨證功能。導(dǎo)出某證候規(guī)則后,依據(jù)該規(guī)則文件,可對(duì)數(shù)據(jù)進(jìn)行辨證。辨證過程:依據(jù)規(guī)則的閾值和癥狀分值,對(duì)原始數(shù)據(jù)癥狀進(jìn)行計(jì)算分值總和,根據(jù)該總分值與閾值的比較來判斷是否屬于該證候。
圖1 氣虛證辯證結(jié)果
首先,點(diǎn)擊菜單欄中“分析”--->“使用規(guī)則進(jìn)行辨證…”,讀入csv 格式數(shù)據(jù)文件,然后讀入對(duì)應(yīng)csv 格式規(guī)則文件。最后進(jìn)行辨證,辨證結(jié)果文件導(dǎo)出在數(shù)據(jù)文件相同的文件夾下。圖1 為辨證結(jié)果,文件名為“氣虛證_辨證結(jié)果.csv”,文件中將辨證結(jié)果添加到原始數(shù)據(jù)的最后一列,列名為“氣虛證”,數(shù)值1表示有氣虛證,0表示無氣虛證。
3)證候與西醫(yī)指標(biāo)對(duì)應(yīng)分析功能。為分析中醫(yī)證候與西醫(yī)指標(biāo)之間的關(guān)系,孔明燈5.0 提供了證候與西醫(yī)指標(biāo)對(duì)應(yīng)分析的功能,對(duì)比是否存在某證候的兩類人群,發(fā)掘哪些西醫(yī)指標(biāo)對(duì)證候的存在有較大影響。采用T檢驗(yàn)原理,得到p和t兩個(gè)值,p值表示有無統(tǒng)計(jì)學(xué)意義,t值表示正負(fù)相關(guān)性。根據(jù)p值最小的幾個(gè)指標(biāo),發(fā)掘西醫(yī)指標(biāo)對(duì)判斷是否屬于氣虛證(以氣虛證為例)的影響。以某數(shù)據(jù)集為例,得到結(jié)果如圖2所示,共包含四部分:西醫(yī)指標(biāo)在原始數(shù)據(jù)中列的序號(hào)、西醫(yī)指標(biāo)名稱、t值、p值。
雖然孔明燈單機(jī)版包含多種模型學(xué)習(xí)方法,也被國內(nèi)外相關(guān)研究者廣泛使用,但在學(xué)習(xí)模型時(shí),算法底層維護(hù)的是一個(gè)特殊貝葉斯網(wǎng)絡(luò),需要學(xué)習(xí)出整個(gè)網(wǎng)絡(luò)結(jié)構(gòu),以及網(wǎng)絡(luò)中所有癥狀顯變量節(jié)點(diǎn)和隱變量節(jié)點(diǎn)的條件概率表,并利用貝葉斯評(píng)分規(guī)則選擇最優(yōu)的模型及參數(shù),這些計(jì)算過程都屬于NP 難問題。所以,單機(jī)版孔明燈在模型學(xué)習(xí)時(shí),存在計(jì)算時(shí)間長、獨(dú)占電腦資源等不足,特別在處理的數(shù)據(jù)量較大時(shí),需幾十天時(shí)間才能學(xué)習(xí)出模型。
因此,為解決單機(jī)版孔明燈在計(jì)算能力上存在的不足,我們基于該軟件最新版(V5.0),設(shè)計(jì)開發(fā)了學(xué)習(xí)隱結(jié)構(gòu)模型的中醫(yī)藥數(shù)據(jù)分析平臺(tái),即孔明燈網(wǎng)絡(luò)版。網(wǎng)絡(luò)版平臺(tái)有三個(gè)節(jié)點(diǎn)組成,一臺(tái)web節(jié)點(diǎn)部署web服務(wù)、一臺(tái)數(shù)據(jù)庫節(jié)點(diǎn)部署數(shù)據(jù)庫、一臺(tái)計(jì)算節(jié)點(diǎn)負(fù)責(zé)任務(wù)的計(jì)算,能夠最多支持200 個(gè)用戶同時(shí)進(jìn)行7*24 小時(shí)的計(jì)算,模型學(xué)習(xí)時(shí)間縮短至單機(jī)版軟件的五分之一,較大地方便了用戶。目前網(wǎng)絡(luò)版平臺(tái)正在開放測試中,網(wǎng)址為http://ai.hactcm.edu.cn,其主要功能模塊子系統(tǒng)如下。
該模塊負(fù)責(zé)對(duì)用戶的管理,包括新增用戶、刪除用戶;權(quán)限分配、修改密碼;修改個(gè)人資料、重置密碼;凍結(jié)用戶、解凍用戶等功能。平均響應(yīng)時(shí)間小于1 s,系統(tǒng)最大響應(yīng)時(shí)間小于3 s。如下圖3所示。
綜合管理主要負(fù)責(zé)對(duì)用戶的權(quán)限管理,包括:1)機(jī)構(gòu)管理:負(fù)責(zé)科研所、會(huì)員單位等的管理;2)字典管理:負(fù)責(zé)系統(tǒng)字典庫的管理;3)業(yè)務(wù)日志管理:負(fù)責(zé)記錄用戶操作的所有日志;4)登錄日志管理:負(fù)責(zé)記錄用戶登錄操作的日志;5)監(jiān)控管理:負(fù)責(zé)記錄數(shù)據(jù)庫、鏈接池、SQL、Session、Spring 以及API 的監(jiān)控;6)通知管理:負(fù)責(zé)發(fā)布一些系統(tǒng)公告。如下圖4所示。
圖2 氣虛證與部分西醫(yī)指標(biāo)對(duì)應(yīng)關(guān)系
圖3 用戶中心模塊
圖4 綜合管理模塊
調(diào)度中心為核心模塊之一,是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度框架,負(fù)責(zé)對(duì)任務(wù)進(jìn)行資源的分配,實(shí)現(xiàn)負(fù)載均衡和更大的負(fù)載量。它有三種角色:1)JobClient(任務(wù)調(diào)度):主要負(fù)責(zé)提交任務(wù), 并接收任務(wù)執(zhí)行后的反饋結(jié)果;2)JobTracker(任務(wù)分配):負(fù)責(zé)接收并分配任務(wù),完成任務(wù)調(diào)度;3)TaskTracker(任務(wù)執(zhí)行):負(fù)責(zé)執(zhí)行任務(wù),執(zhí)行完反饋給JobTracker。
各個(gè)節(jié)點(diǎn)都是無狀態(tài)的,通過部署多個(gè)節(jié)點(diǎn)來實(shí)現(xiàn)負(fù)載均衡和承擔(dān)更大的負(fù)載量,框架具有很好的容錯(cuò)能力。采用多種注冊(cè)中心(Zookeeper)進(jìn)行節(jié)點(diǎn)信息暴露和主(master)選舉;部署了(Mongo or Mysql)存儲(chǔ)任務(wù)的隊(duì)列和執(zhí)行日志,采用netty 實(shí)現(xiàn)底層通信,支持實(shí)時(shí)任務(wù)和定時(shí)任務(wù)(如:3天之后執(zhí)行)。
具體執(zhí)行步驟:首先,JobClient 提交任務(wù)給JobTracker。對(duì)提交的任務(wù),有兩種不同的客戶端做出處理。 一種是當(dāng)JobTracker 不存在或者提交失敗,直接返回提交失敗。另一種稱為重試客戶端,如果提交失敗,先存儲(chǔ)到本地FailStore(失敗存儲(chǔ),多線程訪問,做文件鎖處理),返回給客戶端提交成功的信息,待JobTracker可用時(shí),再將任務(wù)提交。接著,JobTracker收到JobClient 提交的任務(wù),將任務(wù)存入任務(wù)隊(duì)列。JobTracker 等待 TaskTracker 的 Pull 請(qǐng)求,然后將任務(wù)Push 給 TaskTracker 去 執(zhí) 行 。 TaskTracker 收 到JobTracker分發(fā)來的任務(wù)后,從線程池中拿到一個(gè)線程去執(zhí)行。執(zhí)行完畢之后,再反饋任務(wù)執(zhí)行結(jié)果給JobTracker(成功or 失敗[失敗有失敗錯(cuò)誤信息])。此時(shí),如果發(fā)現(xiàn)JobTacker不可用,那么存儲(chǔ)本地FailStore,等待TaskTracker可用的時(shí)候再反饋。反饋結(jié)果同時(shí),詢問JobTacker 是否有新的任務(wù)要執(zhí)行。JobTacker 收到TaskTracker 節(jié)點(diǎn)的任務(wù)結(jié)果信息后,根據(jù)任務(wù)信息決定是否反饋給客戶端。若不需要反饋就直接刪除,否則,直接反饋,反饋失敗則等待重新反饋。最后,JobClient收到任務(wù)執(zhí)行結(jié)果,進(jìn)行后續(xù)的邏輯處理。
分布式計(jì)算是系統(tǒng)核心模塊,主要包括算法執(zhí)行程序。具體負(fù)責(zé)處理數(shù)據(jù)、生產(chǎn)數(shù)據(jù),讀入用戶提供的數(shù)據(jù)。采用隱結(jié)構(gòu)BI、EAST 等算法進(jìn)行分析數(shù)據(jù),然后學(xué)習(xí)得到隱樹模型圖,并展示給用戶。算法執(zhí)行模塊執(zhí)行封裝好的算法,調(diào)用算法API,并把算法的執(zhí)行的結(jié)果保存到數(shù)據(jù)庫。此模塊為具體計(jì)算模塊,當(dāng)數(shù)據(jù)量大時(shí),運(yùn)行時(shí)間較長,幾天至幾十天。在運(yùn)算過程中,與其他模塊相互通信,保證多個(gè)用戶能夠同時(shí)運(yùn)行使用系統(tǒng),并計(jì)算和監(jiān)控系統(tǒng)使用資源情況。具體如圖5所示。
主要包括:1)在TaskTracker 端提供業(yè)務(wù)日志記錄器,供應(yīng)用程序使用,通過業(yè)務(wù)日志器,將日志提交到JobTracker。這些業(yè)務(wù)日志通過任務(wù)ID 串聯(lián),在Admin 中實(shí)時(shí)查看任務(wù)的執(zhí)行進(jìn)度。2)SPI(service provider interface)擴(kuò)展支持。SPI 擴(kuò)展可以達(dá)到零侵入,只需要實(shí)現(xiàn)相應(yīng)的接口,并實(shí)現(xiàn)即可被LTS(lighttask-scheduler)使用。3)任務(wù)隊(duì)列的擴(kuò)展,主要支持console,mysql,mongo,用戶也可以通過擴(kuò)展選擇輸送日志。4)故障轉(zhuǎn)移,若正在執(zhí)行任務(wù)的TaskTracker 宕機(jī)后,JobTracker 立即將在宕機(jī)TaskTracker 的所有任務(wù)再分配給其他正常的TaskTracker 節(jié)點(diǎn)執(zhí)行。5)節(jié)點(diǎn)監(jiān)控,對(duì)JobTracker、TaskTracker 節(jié)點(diǎn)進(jìn)行資源監(jiān)控、任務(wù)監(jiān)控等,實(shí)時(shí)在管理員后臺(tái)查看,進(jìn)而進(jìn)行合理的資源調(diào)配。 6)多樣化任務(wù)執(zhí)行結(jié)果支持。LTS框架提供四種執(zhí)行結(jié)果支持,EXECUTE_SUCCESS,EXECUTE_FAILED,EXECUTE_LATER,EXECUTE_EXCEPTION,并對(duì)每種結(jié)果采取相應(yīng)的處理機(jī)制,例如重試。7)FailStore 容錯(cuò),采用 FailStore 機(jī)制來進(jìn)行節(jié)點(diǎn)容錯(cuò),不會(huì)因?yàn)檫h(yuǎn)程通信的不穩(wěn)定性而影響當(dāng)前應(yīng)用的運(yùn)行。
前文介紹了網(wǎng)絡(luò)版系統(tǒng)的各個(gè)功能,本節(jié)從用戶角度介紹使用系統(tǒng)來分析數(shù)據(jù)得到隱樹模型的過程。
圖5 分布式計(jì)算子系統(tǒng)
圖6 網(wǎng)絡(luò)版系統(tǒng)登錄界面
按照孔明燈軟件規(guī)定的格式整理好待分析數(shù)據(jù),打開系統(tǒng)網(wǎng)址http://ai.hactcm.edu.cn,輸入賬號(hào)密碼和驗(yàn)證碼(聯(lián)系作者即可開通賬號(hào)),點(diǎn)擊登錄,如圖6所示。
然后點(diǎn)擊分析任務(wù)管理→新增任務(wù),彈出如下圖7 對(duì)話框,在對(duì)話框中輸入任務(wù)名稱和讀入數(shù)據(jù)文件,然后點(diǎn)擊解析,加載數(shù)據(jù)完成。
加載完數(shù)據(jù)后,在分析任務(wù)管理中,選擇查看設(shè)置任務(wù)參數(shù),進(jìn)行修改參數(shù)和算法,如圖8 和圖9 所示。在圖9 中設(shè)置好參數(shù)和算法后,點(diǎn)擊保存按鈕。然后在圖8中點(diǎn)擊運(yùn)行任務(wù),即可開始模型學(xué)習(xí),根據(jù)數(shù)據(jù)量大小其學(xué)習(xí)所需時(shí)間不同。
學(xué)習(xí)得到模型以后,在系統(tǒng)中可查看模型結(jié)果、模型詮釋、模型評(píng)分、建立規(guī)則,同時(shí)可以導(dǎo)出模型文件,方便在客戶端程序中進(jìn)行模型排版。在分析任務(wù)監(jiān)控中,點(diǎn)擊已完成,查看已完成的數(shù)據(jù)分析結(jié)果,如圖10所示。
圖7 添加待分析的數(shù)據(jù)
圖8 分析任務(wù)管理
圖9 設(shè)置參數(shù)和算法
圖10 中可導(dǎo)出模型BIF 文件,若需要在網(wǎng)絡(luò)平臺(tái)中查看結(jié)果樹,選擇其中某個(gè)結(jié)果,點(diǎn)擊查看結(jié)果樹,觀察該模型樹狀結(jié)構(gòu),如圖11 所示。在圖11 中,可以對(duì)該模型進(jìn)行詮釋、評(píng)價(jià)模型、建立辯證規(guī)則等操作。
表2 網(wǎng)絡(luò)版與單機(jī)版運(yùn)行時(shí)間對(duì)比表 分鐘
圖10 查看運(yùn)行結(jié)果列表
圖11 孔明燈網(wǎng)絡(luò)版得到某模型結(jié)構(gòu)展示
為測試網(wǎng)絡(luò)版的計(jì)算效力,采用三種不同規(guī)模的數(shù)據(jù)集與單機(jī)版進(jìn)行測試對(duì)比。數(shù)據(jù)集一規(guī)模為117行119列、數(shù)據(jù)集二規(guī)模為1087行124列、數(shù)據(jù)集三規(guī)模為8000 行100 列,分別在網(wǎng)絡(luò)版和單機(jī)版上進(jìn)行測試,調(diào)用算法為LTM-EAST,單機(jī)版運(yùn)行在主流配置的電腦上,運(yùn)行時(shí)間結(jié)果如下表2所示。
通過表2 可以明顯看出,網(wǎng)絡(luò)版系統(tǒng)的計(jì)算效力明顯提高,計(jì)算效力較單機(jī)版提升5 倍以上。特別是運(yùn)行數(shù)據(jù)集三時(shí),由單機(jī)版的30 天降低到5 天左右,明顯節(jié)省了模型學(xué)習(xí)時(shí)間。
本文為解決隱結(jié)構(gòu)分析軟件孔明燈單機(jī)版在計(jì)算能力和單點(diǎn)計(jì)算的不足,基于單機(jī)版的底層算法搭建了隱結(jié)構(gòu)分析的網(wǎng)絡(luò)版,該網(wǎng)絡(luò)版利用私有云計(jì)算資源,動(dòng)態(tài)調(diào)整所需計(jì)算資源,能夠并發(fā)支持200 個(gè)用戶同時(shí)使用,并實(shí)現(xiàn)7*24 h 全天候計(jì)算,在實(shí)際的數(shù)據(jù)集測試中,其計(jì)算效率較單機(jī)版平均提升5倍以上。
同時(shí)網(wǎng)絡(luò)版還具有業(yè)務(wù)日志、登錄日志、監(jiān)控管理等多個(gè)附加功能,較大地方便了用戶和管理人員,為推廣和使用隱結(jié)構(gòu)研究中醫(yī)藥起到積極的作用,也為中醫(yī)藥的傳承和發(fā)展做出一定的貢獻(xiàn)。
世界科學(xué)技術(shù)-中醫(yī)藥現(xiàn)代化2020年7期