勾志竟,宮志宏,徐 梅,劉布春
(1.天津市氣象信息中心,天津 300074; 2.天津市氣候中心,天津 300074; 3.中國農業科學院 農業環境與可持續發展研究所,北京 100081)
隨著科技的進步,氣象部門獲取數據的途徑也越來越多,收集并產生的氣象數據呈指數級增長。如何將數據挖掘技術應用到氣象預報預測和氣象災害預測等方面[1-3],從海量的氣象數據中挖掘有價值的信息,成為氣象行業研究的重點。傳統的數據處理方法已經不能很好地處理海量數據,挖掘數據內部規律時更為乏力,而數據挖掘算法與分布式處理框架[4]的出現為挖掘海量氣象數據提供了一種新的思路。
陳正威[5]在Hadoop平臺上運用預處理有向無環圖和支持向量機(PDAG-SVM)算法對降水量做出預測,該方法在預測精度和預測效率上都取得了令人滿意的結果;王昊等[6]提出了一種Hadoop平臺下基于離散貝葉斯網絡的數據挖掘改進算法,預測精度明顯高于目前短期氣候預測中采用的樸素貝葉斯算法;張晨陽等[7]提出基于Hadoop的計算等價類的數據約簡算法與樸素貝葉斯分類算法,該并行數據挖掘方案可以有效處理海量氣象數據,并具有良好的擴展性;Lv Zhenhua等[8]提出了并行K-means算法,并用于遙感圖像的分類;李莉等[9]基于Spark平臺提出并行K-means算法對氣候區進行劃分,對氣象領域研究有重要現實意義。
從目前的相關研究可以看出,學者們不斷對海量數據挖掘方法進行研究和優化,而聚類算法作為數據挖掘的重要方法,將其與分布式處理框架相結合[10-12]處理海量數據成為數據挖掘領域越來越活躍的研究方向。文中提出了一種Canopy-FCM算法,可以有效避免模糊C-均值聚類算法對初始聚類中心敏感的問題,同時針對海量氣象數據,采用Spark內存計算分布式框架快速有效地從氣象數據中挖掘出有用的信息,大大的提高了運行效率。
模糊C均值(fuzzy C-means,FCM)算法[13]是1974年由Dunn提出并由Bezdek推廣的,它是基于模糊集合論,把聚類問題轉化為非線性規劃問題,并通過迭代求解。
令X={X1,X2,…,Xn}為待分類樣本,FCM將其分為c個模糊組,使得目標函數值最小,目標函數如下所示:

(1)
(2)
其中,uij是樣本j屬于類i的隸屬度,Ci為第i類的中心,m∈[1,∞]為模糊因子。
通過式(2),采用拉格朗日乘數法構造以下目標函數:
(3)
對所有參數求導,得到使式(3)達到最小值的必要條件為:
(4)
(5)
由式(4)和式(5)可以知道,給定初始樣本集合X,以及分類數目c和模糊因子m,FCM算法按照以下步驟不斷迭代就可以計算出隸屬度矩陣U和聚類中心C。
(1)用隨機數生成器生成初始隸屬度矩陣U,且滿足約束條件式(2)。
(2)用式(4)更新聚類中心。
(3)用式(5)更新隸屬度矩陣U。
(4)計算式(1)的目標函數值,如果小于閾值ε,則算法停止,否則重復步驟(2)和(3)。
FCM算法采用隨機生成聚類中心的方法,但無法保證為每個分類找到較好的中心,而聚類中心直接影響算法的運行效率。針對初始中心敏感,容易陷入局部最優的問題,文中采用Canopy算法[14]初始化聚類中心。Canopy算法可以很快得到最優的分類數,其具體步驟如下:
(1)給定樣本X1,X2,…,Xn,設定初始閾值T1,T2,T1>T2。
(2)在樣本中隨機挑選樣本x,計算x到其他樣本點的距離d。
(3)把d (4)重復步驟2、3,直到數據集為空。 Canopy-FCM算法基本步驟如下: Step1:利用Canopy算法生成初始聚類中心。 Step2:初始化隸屬度矩陣U。 Step3:更新聚類中心C。 Step4:更新隸屬度矩陣U。 Step5:是否滿足終止條件,若滿足,則算法停止;否則,重復Step3和Step4。 Spark是基于內存計算的分布式計算框架,起源于加利福尼亞大學伯克利分校的實驗室研究項目[15],其低延遲、低系統開銷、容錯性高、分布式數據結構以及強大的函數式編程接口可以很好應對迭代式計算應用的高性能需求,在大規模數據處理任務中有廣泛的應用。 Spark在分布式環境下采用主從結構模型,包括Driver和Worker節點,程序運行之前將數據存儲在Hadoop Distributed File System(HDFS)中,接著Driver會運行應用中的方法創建SparkContext以及RDD,DAGScheduler對象將每個job分成多個Stage,并為每個stage創建TaskSet,TaskScheduler將task提交給executor執行,executor調用Taskrunner封裝task,并行線程池中取一個線程執行task。其架構如圖1所示。 圖1 Spark架構 基于Spark的Canopy-FCM算法流程如圖2所示。 圖2 基于Spark的Canopy-FCM算法流程 (1)配置好Spark運行環境并初始化各參數。通過hadoop fs -put命令將數據上傳到HDFS上,調用SparkContext的sc.textFile()方法將數據轉換為Spark-RDD,通過map操作轉換為向量緩存到內存中。 當我們在進行股票運作時,追求的是績優股,當我們在購買房產時,追求的是未來的黃金地段,同樣,國有企業在進行經營時所追求的就是績優股、黃金地段,就是資產的良性發展。油田企業作為國有企業的一員,就是要維護國有資產安全,保障企業可持續發展。從當前企業審計的要求來看,質量和責任是企業審計的基礎,績效是企業審計的方向和目標,就是要發現企業是否成為了藍籌股,把投入產出比例如何作為國有資產的組成部分,油田企業的績效審計越來越被重視,它進一步擴展和深化了油田企業審計的內涵。 (2)在各個子節點通過map操作計算數據集中每個點到Canopy中心點的歐氏距離,進而得到局部的Canopy中心點,然后通過reduce操作得到全局的Canopy中心點,將其作為FCM的初始聚類中心,并廣播給各個子節點。 (3)在各個子節點通過map操作計算每個數據點到各中心的歐氏距離和隸屬度,然后通過reduceByKey()和collectAsMap()方法得到各數據點到每個分類的距離之和與隸屬度之和,對隸屬度和聚類中心進行更新。 (4)計算目標函數的值,判斷結果是否收斂,如果收斂則算法結束,通過Combine操作合并中間結果,并通過Reduce操作得到全局聚類中心,否則重復步驟(3)。 Canopy-FCM算法并行化[16]的偽代碼如下: Input:X={X1,X2,…,Xn},T1,T2,m,K Output:C={C1,C2,…,Cc} Initialization(); l←data.mapPartitions{points? forxi←points{ }.reduce(merge) C'←C;C←null forj=1 toC{ (sumUX,sumU)←l(j) C+=sumUX/sumU } } 實驗采用Spark分布式集群,集群搭建在服務器虛擬化平臺上,選取1臺機器作為主節點,其他7臺機器作為工作節點。虛擬機各項配置及集群的配置信息分別如表1、表2所示,實驗數據采用天津經過質控后的208個區域自動氣象站4~10月夏半年逐月降水觀測數據。 表1 虛擬機配置信息 由表2可以看出Spark分布式集群在運行時需要一系列的后臺程序,主要有: Master-負責資源的調度(決定在哪些Worker上執行executor)和監控Worker。 Worker-負責執行任務的進程(executor),并將當前機器的信息通過心跳匯報給Master。 NameNode-負責管理文件系統的Namespace。 DataNode-負責管理各個存儲節點。 SecondaryNameNode-NameNode的熱備,負責周期性地合并Namespace image和Edit log。 表2 集群信息配置 實驗結果如圖3所示,由圖3可以看出天津208個區域自動氣象站降水分布可分為4個區域,1區主要集中在中部和北部區域,共有96個站;2區集中在東部區域,共有29個站;3區集中在東南部,共有31個站;4區主要集中在西南部,共有52個站。 圖3 天津降水區劃圖 圖4是實驗得到的天津市4個分區降水量年平均分布圖,由圖4可以看出,4個分區的降水主要集中在6~9月,7月降水量最為顯著,其次是8月、6月、9月,這一趨勢與中國氣象局氣象數據中心發布的天津氣候類型圖(1981-2010)一致。4個分區的具體分析如下: 圖4 天津市4個分區降水量年平均分布 1區主要位于天津中部和北部區域,該區域土壤以鹽化潮土和粘質土為主,5月年平均降水量遠低于其他分區,4~10月總年平均降水量485.7 mm。 2區主要位于天津的東部區域,屬于海積、沖積平原區,地勢北高南低,4月、7月、10月年平均降水量高于其他三個分區,6月年平均降水量遠低于其他分區,4~10月總年平均降水量498.1 mm。 3區主要位于天津市的東南沿海地區,地勢低平,以海積低平原為主,土層受海潮影響鹽漬化比較嚴重,5月、8月、9月年平均降水量遠高于其他三個分區,4~10月總年平均降水量508.1 mm。 4區主要位于天津的西南部,該區域以洼地沖積平原和濱海平原為主,地形平坦但多洼地,地勢南高北低,西高東低,4月、7月、8月、9月及10月年平均降水量均低于其他分區,4~10月總年平均降水量425.2 mm。 為了對比文中設計的Spark平臺和Hadoop平臺的集群性能,分別在Hadoop環境下和Spark環境下由單節點到8節點執行相同大小的區域自動站降水數據文件,得到兩種環境下的加速比,如圖5所示。 圖5 Hadoop平臺和Spark平臺的加速比 由圖5不難看出,當節點數目為單節點時,Hadoop平臺和Spark平臺的性能都處于最差。隨著DataNode節點數量的增加,Spark平臺和Hadoop平臺算法的運行時間都有不同程度縮短,而Spark平臺的加速比要優于Hadoop平臺,說明文中提出的算法在Spark平臺下能有效地提高算法的性能,及時準確地挖掘出海量氣象數據的有價值信息。 針對模糊C-均值聚類算法對初始聚類中心敏感及因迭代計算次數增加導致內存不足的問題,設計了一種基于Spark框架的Canopy-FCM并行化聚類算法。該算法結合Canopy算法與模糊C-均值聚類算法,避免了FCM算法對初始化敏感的問題,并結合Spark分布式框架內存計算的優勢,大大降低了海量氣象數據的處理時間。通過采用天津市208個區域自動氣象站4~10月逐月降水觀測數據,評估了天津市不同區域的降水情況。實驗結果表明,提出的方法不僅可以快速有效地從氣象數據中挖掘出有用的信息,同時還有良好的擴展性,能夠為相關部門做好抗旱救災、防災救災工作提供一種全新的思路和方法。但方法僅針對降水區進行了劃分,未來可以結合溫度、濕度、干燥度等因素做進一步的氣候區劃研究。2.2 Canopy-FCM算法框架
3 基于Spark的并行Canopy-FCM模型
3.1 Spark計算模型

3.2 Canopy-FCM算法的并行化

4 實例分析
4.1 實驗環境與數據集


4.2 實驗結果及分析



5 結束語