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