劉 迪,鄭曉梅,黎鉦暉
(南京中醫(yī)藥大學 信息技術學院,江蘇 南京 210023)
古代疫病數據繁雜多怪,但是其中蘊含了豐富的中醫(yī)疫病的知識,分析數據中的潛在規(guī)律,可以為中醫(yī)臨床提供客觀有效的指導。目前對古代疫病數據的研究大多應用數理統計方法對某個區(qū)域、某個時期來分析疫病的病因病機、治則治法、方藥配伍、臨床療效等。但實際上疫病的相關因素有很多,如天氣、季節(jié)、地域、朝代、用藥、人群等。在某種疫病的生命周期只有某幾種因素導致了疫病的健壯或衰亡。而其他因素則是一些基礎的,影響度較小的,拋開這些影響因素不會對疫病的發(fā)展趨勢產生很大的變化。如果能夠量化某種因素對某種疫病的影響程度,就能找出眾多疫病之間的決定性因素的相似點,從而發(fā)掘古代疫病數據中的潛在規(guī)律。
就當前而言針對古代疫病的影響因素的分析,完全基于某種算法,但是無論哪一種算法都經受不住高迭代度的復雜運算,如文獻[1]中基于Apriori算法對古代疫病數據進行數據挖掘,原因就在于目前計算機的硬件限制,大部分研究都是在用運算時間去填補機器硬件的缺陷,然而,在數據量達到TB,PB級別時,時間的彌補也無濟于事。但是當今社會,信息化時代,我們每個人每天都在產生大量的數據,傳統的計算方法有很大缺陷,如何高效、迅速地發(fā)掘數據中的潛在價值,本文提出了基于Spark的因子分析法,即將大數據分布式存儲計算架構與傳統的分析算法相結合,能夠解決數據量過大導致運算時間過長甚至無法進行運算的問題[2]。
隨著云計算、移動互聯網等新一代信息技術的創(chuàng)新和應用普及,數據的計算方式開啟了一次重大的轉型,由于古代疫病數據需要繁雜的分析工作,采用適合的計算分析方法必不可少,本文將古代疫病數據算作計算數據,利用Spark與傳統的因子分析算法相結合,幫助找出疫病數據中的潛在規(guī)律,了解古代疫病的特點,對現代中醫(yī)疫病的治療提供有效的臨床指導。
本研究的目的在于尋找各種和疫病相關因素之間的潛在規(guī)律,為現代的臨床醫(yī)療提供參考指導。在我們從古書中抽取的古代疫病數據中,針對一種疫病有多重不同的影響因素,例如年代、病名、地域、季節(jié)、環(huán)境、病因等,維度復雜混亂沒有規(guī)律可循。
因子分析多元統計分析處理的是多變量問題。由于變量較多,增加了分析問題的復雜性。但在實際問題中,變量之間可能存在一定的相關性,因此,多變量中可能存在信息的重疊。人們自然希望通過克服相關性、重疊性,用較少的變量來代替原來較多的變量,而這種代替可以反映原來多個變量的大部分信息,這實際上是一種“降維”的思想[3]。
Spark是一個圍繞速度、易用性和復雜分析構建的大數據處理框架。Spark運行在現有的Hadoop分布式文件系統(Hadoop Distributed File System,HDFS)基礎之上提供額外的增強功能。它支持將Spark應用部署到現存的Hadoop v1集群或Hadoop v2 YARN集群甚至是Mesos之中。Spark通過在數據處理過程中成本更低的洗牌(Shuffle)方式,將MapReduce提升到一個更高的層次。利用內存數據存儲和接近實時的處理能力,Spark比其他的大數據處理技術的性能要快很多倍。Spark還支持大數據查詢的延遲計算,這可以幫助優(yōu)化大數據處理流程中的處理步驟。Spark還提供高級的API以提升開發(fā)者的生產力,除此之外還為大數據解決方案提供一致的體系架構模型[4]。Spark的結構如圖1所示。
因子分析法是指從研究指標相關矩陣內部的依賴關系出發(fā),把一些信息重疊、具有錯綜復雜關系的變量歸結為少數幾個相關的綜合因子的一種多元統計分析方法。基本思想是:根據相關性大小把變量分組,使得同組內的變量之間相關性較高,但不同組的變量不相關或相關性較低,每組變量代表一個基本結構—公共因子。
圖1 Spark結構
但是在矩陣求解的過程中,大部分運算都是建立在過長的時耗上,不能進行的運算,但是如果降低求解時的迭代次數,結果會發(fā)生偏移。所以引入Spark分布式計算架構,根據MapReduce的思想,將矩陣進行分解計算,從而提高運算的效率[5]。
古代疫病數據中含有大量的疫病相關因素,針對其影響因素較多的特點,本文采用因子分析法進行屬性的劃分,通過計算給出每種因素的權重,或是形成新的屬性定義,找到疫病相關的新的因素,能夠對疫病的興衰提供詮釋。
收集《蘭室秘藏》《簡明醫(yī)彀》《古今醫(yī)鑒》《丹溪心法》等古代醫(yī)書籍中提取和疫病有關的部分,將其分組歸類,對描述的方式進行歸一化、標準化,最終的數據庫中包含的年代、病名、地域、季節(jié)、環(huán)境、病因、病例數、年齡、體質、性別、癥狀、證型、病機、治法、方劑、劑型、組成及劑量、用法、其他療法、療效。所有的字段都以古代疫病為基礎,從醫(yī)書中找出相關影響因素(見表1)[6]。
Spark中的MapReduce將計算分解為map和Reduce兩個操作,我們引用mapreduce的計算思想將相關系數矩陣使用QR進行分解,將每一塊提交到一個worknode中,各個worknode相互獨立并同時進行運算,再經過Reduce將矩陣的求解結果取出進行膠合。即將大矩陣劃分為小矩陣,在不減少迭代次數的情況下短時間對其進行求解,提高運算的準確率和效率。
QR分解法是目前求一般矩陣全部特征值的最有效且最廣泛應用的方法,一般矩陣先經過正交相似變化成上Hessenberg矩陣,然后再應用QR方法求特征值特征向量,由于因子分析處理的是相關系數矩陣,是對稱矩陣,從而可以進行分塊存儲、運算,在不減少迭代次數的基礎上有效地減少運行的時間,提高效率[7]。Spark和因子分析組合流程如圖2所示。
圖2 Spark和因子分析組合流程
表1 古代疫病相關數據
我們得到的初始因子解各主因子的典型代表變量不是很突出,容易使得因子的意義含糊不清,不便于對實際問題進行分析,出于該種考慮,可以對初始公共因子進行線性組合,即進行因子旋轉,以期找到意義更為明確、實際意義更明顯的因子[8-9]。
實驗設置了兩組比對:第一組,在運算模式都為單機串行的情況下,兩個矩陣和4個矩陣樣本個數相同、屬性個數不同的情況下運算的時耗。第二組,在分塊的個數都為4的情況下,計算不同屬性個數,單機串行將關系型矩陣分別分為兩個和4個矩陣的試驗結果對比如表2所示。
表2 分塊不同的運行時間
單機代碼實現因子分析和基于Spark的因子分析的運行時間對比結果如表3所示(分塊量為4)。
從表3可以看出,相對于單機計算,基于Spark的因子分析并行算法在速度上明顯更快,并行化的速度在屬性量少的情況下差異不大,但是在屬性的個數大幅度提升之后,并行化的運行速度要遠高于單機的運行速度,在迭代次數不減少的情況下運行的性能十分可觀,由此可見算法十分高效。
表3 單機和Spark運行時間對比
本研究利用QR分解法對因子分析法中的相關系數矩陣進行分解,并使用Spark對分解的矩陣進行分布式運算,再將計算的結果進行膠合,從而提高大樣本數據、高迭代次數下因子分析法的運行效率。從實驗結果可以看出,本文提出的基于Spark的因子分析算法對多因素的古代疫病數據具有良好的運行性能,從分塊個數來看,隨著分塊的數量的增加,分塊的優(yōu)勢越來越明顯,相對于單機運行超多屬性的因子分析算法而言,基于Spark的并行計算模型的運行效率更高。
[1]蔡婉婷,李新霞,陳仁壽.基于Apriori算法的古現代疫病用藥比較與分析[J].時珍國醫(yī)國藥,2017(6):1510-1512.
[2]辛智科.中國古代疫病的流行及其防治[C].哈爾濱:國際中國科學史會議,2004.
[3]甄盡忠.近30年來中國古代疫病流行及社會應對機制研究綜述[J].商丘師范學院學報,2010(8):59-64.
[4]張稚鯤.疫?。毙詡魅拘约膊。┕沤裼盟幪攸c及配伍規(guī)律研究[D].南京:南京中醫(yī)藥大學,2017.
[5]熊益亮.明清閩北疫情資料整理與研究[D].福州:福建中醫(yī)藥大學,2014.
[6]單聯喆.明清山西疫病流行規(guī)律研究[D].北京:中國中醫(yī)科學院,2013.
[7]宿佩勇.福州古代疫病文獻資料研究[D].福州:福建中醫(yī)學院,2005.
[8]王瑤.基于Spark的主成分分析和因子分析并行化的研究與實現[D].北京:北京郵電大學,2017.
[9]徐斌,呂梁.基于“i-Spark”模型的新員工創(chuàng)新素質測評實證研究[J].中國人力資源開發(fā),2016(6):55-62.