唐立,李六杏,王啟亮 ,王睿,方政
(1.安徽經(jīng)濟(jì)管理學(xué)院 信息工程系,安徽 合肥,230031;2.安徽農(nóng)業(yè)大學(xué) 信息管理學(xué)院,安徽 合肥,230031)
隨著農(nóng)業(yè)農(nóng)村信息化推進(jìn),利用農(nóng)業(yè)大數(shù)據(jù)對農(nóng)作物產(chǎn)量進(jìn)行預(yù)測是國內(nèi)外學(xué)者研究的熱點(diǎn)問題之一。在早年對農(nóng)作物預(yù)測僅限于幾個(gè)容易收集的參數(shù),如播種面積、化肥施用量、農(nóng)業(yè)從業(yè)人員及每公頃產(chǎn)量[1]。而當(dāng)今現(xiàn)代化農(nóng)業(yè)的建設(shè)促使了農(nóng)業(yè)數(shù)據(jù)快速增長,對于以前難以采集的數(shù)據(jù)變得容易,如土壤成分監(jiān)控?cái)?shù)據(jù)、氣象數(shù)據(jù)、現(xiàn)代化機(jī)械使用數(shù)據(jù)、遙感灌溉數(shù)據(jù)[2],而這些海量數(shù)據(jù)處理不當(dāng)會影響農(nóng)作物產(chǎn)量預(yù)測的精度。本文結(jié)合農(nóng)業(yè)大數(shù)據(jù)的特點(diǎn)以及大數(shù)據(jù)技術(shù)的發(fā)展,擬采用Spark框架作為內(nèi)存計(jì)算框架應(yīng)對大量數(shù)據(jù)計(jì)算,同時(shí)運(yùn)用EIDA優(yōu)化BP神經(jīng)網(wǎng)絡(luò)算法對安徽亳州地區(qū)的小麥農(nóng)產(chǎn)量進(jìn)行預(yù)測,并以數(shù)據(jù)實(shí)驗(yàn)證明該算法的有效性。
農(nóng)作物產(chǎn)量受諸多因素影響,國內(nèi)很多專家學(xué)者對此進(jìn)行了很多研究,在相同的農(nóng)作物品種和栽培技術(shù)前提下,如施麗娟等[3]指出化肥施用量、農(nóng)藥使用量、有效灌溉面積、農(nóng)用塑料薄膜使用量以及農(nóng)業(yè)機(jī)械總動力是農(nóng)作物產(chǎn)量產(chǎn)生主要影響因素。郭梁等[4]指出氣象因素也是影響農(nóng)作物產(chǎn)量的因素之一,實(shí)驗(yàn)數(shù)據(jù)表明棉花作物受氣象因素影響程度為13.22%,油類作業(yè)受氣象影響程度為9.58%,糧食作物如小麥?zhǔn)軞庀笥绊懗潭葹?.39%。因此,根據(jù)施麗娟等[3-4]的研究,初步篩選 8 種影響因素:有效灌溉面積(X1)、化肥施用量(X2)、農(nóng)村用電量(X3)、農(nóng)業(yè)機(jī)械總動力(X4)、第一產(chǎn)業(yè)從業(yè)人數(shù)(X5)、農(nóng)作物播種面積(X6)、農(nóng)作物單位面積產(chǎn)量(X7)、氣象因素(X8)。
為了準(zhǔn)確預(yù)測農(nóng)作物產(chǎn)量,對影響農(nóng)作物產(chǎn)量的因素?cái)?shù)據(jù)進(jìn)行計(jì)算,將農(nóng)村生產(chǎn)過程中海量的數(shù)據(jù)信息歸融為一組有意義的數(shù)值,該數(shù)值就是農(nóng)作物產(chǎn)量因素,通過這些數(shù)值的變化可以精確預(yù)測農(nóng)作產(chǎn)量的波動。本文結(jié)合EIDA算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò),設(shè)計(jì)一個(gè)基于Spark框架的計(jì)算平臺,通過海量農(nóng)業(yè)數(shù)據(jù)預(yù)測農(nóng)作物產(chǎn)量。
Spark是MapReduce分布計(jì)算的替代方案,是新一代大數(shù)據(jù)計(jì)算平臺的代表。Spark的優(yōu)勢有:它通過并聯(lián)執(zhí)行多個(gè)Stage時(shí),是通過內(nèi)存進(jìn)行數(shù)據(jù)運(yùn)算的,無需訪問磁盤;它具有彈性分布式數(shù)據(jù)集RDD和分布式運(yùn)行架構(gòu),可以精確讀取存儲的數(shù)據(jù),使用戶自定義分區(qū)策略;Spark的事件驅(qū)動啟動任務(wù)的方式也減少切換開銷[5]。
由于影響農(nóng)作物產(chǎn)量因素?cái)?shù)據(jù)量巨大,類型繁多,對數(shù)據(jù)預(yù)處理造成極大挑戰(zhàn)。為了快速地從海量的數(shù)據(jù)中高效提取有價(jià)值的預(yù)測數(shù)據(jù),本文依靠Spark分析技術(shù)和分布處理能力,對農(nóng)作物產(chǎn)量因素的大數(shù)據(jù)進(jìn)行預(yù)處理,為本文后面提出的農(nóng)作物預(yù)測的算法提供平臺依托。其框架結(jié)構(gòu)如圖1所示。
圖1 基于Spark的框架Fig.1 Spark based framework
基于Spark的框架有5層。
1)數(shù)據(jù)層是影響農(nóng)作物產(chǎn)量因素?cái)?shù)據(jù)的來源,收集科研數(shù)據(jù),利用Python爬蟲網(wǎng)站農(nóng)業(yè)數(shù)據(jù),收集農(nóng)業(yè)傳感數(shù)據(jù)和日志數(shù)據(jù)。
2)數(shù)據(jù)層的數(shù)據(jù)為原始數(shù)據(jù),種類繁多,結(jié)構(gòu)復(fù)雜,存儲不易。進(jìn)入吸取層,以便篩選出有用數(shù)據(jù),對數(shù)據(jù)進(jìn)行預(yù)處理。對于傳統(tǒng)關(guān)系型數(shù)據(jù)存儲在RDBMS中,并用Sqoop工具導(dǎo)入到HDFS。
3)經(jīng)過ETL的數(shù)據(jù)預(yù)處理,對數(shù)據(jù)進(jìn)行清洗、格式轉(zhuǎn)換、計(jì)算、組合、抽樣等處理。數(shù)據(jù)吸取完畢后進(jìn)入存儲層。對于非結(jié)構(gòu)化和結(jié)構(gòu)化數(shù)據(jù)、關(guān)系型數(shù)據(jù)與非關(guān)系型數(shù)據(jù)、離線數(shù)據(jù)與實(shí)時(shí)數(shù)據(jù)用一種存儲方式顯然不行,調(diào)用HBase、HDFS、RDBMS混合存儲形式。
4)存儲完畢進(jìn)入平臺層。Tachyon是位于Spark計(jì)算框架與HDFS之間的分布式文件系統(tǒng),它能使DFS的文件直接分配到分布式內(nèi)存文件系統(tǒng)中,文件在內(nèi)存中共享,不需要落地磁盤,從而提高效率。首先接受任務(wù)后,驅(qū)動程序(Driver)向資源管理器申請資源,通過Spark Context.text Flie()函數(shù)從分布式文件系統(tǒng)HDFS中讀取所需數(shù)據(jù)形成RDD。然后,在Spark的工作節(jié)點(diǎn)(Worker)上啟動多個(gè)任務(wù)執(zhí)行器(Executor),把Spark Context將程序代碼和分配給每個(gè)處理機(jī)的任務(wù)廣播給每個(gè)Executor。最后,將結(jié)果發(fā)送到Worker上,再返回給驅(qū)動程序(Driver)[6]。通過Spark平臺處理提取可以用于后期預(yù)測計(jì)算的農(nóng)作物產(chǎn)量因素?cái)?shù)據(jù)。
5)在分析層實(shí)現(xiàn)EIDA優(yōu)化BP神經(jīng)網(wǎng)絡(luò)算法。
BP神經(jīng)網(wǎng)絡(luò)算法是最常見的預(yù)測算法之一,目前對它的研究比較深,應(yīng)用也比較廣,它模仿人類神經(jīng)結(jié)構(gòu)和處理信息的方法。數(shù)據(jù)樣本先由從輸入層到隱藏層再到輸出層正向傳播訓(xùn)練,在其過程中得到誤差e,如果誤差e不符合期望值,則反向傳播。采用梯度下降原則對網(wǎng)絡(luò)的權(quán)值和閥值進(jìn)行多次調(diào)整,使誤差e盡可能地接近期望值[7]。
BP算法流程如下:
1)設(shè)定輸入層節(jié)點(diǎn)個(gè)數(shù)為i(i=1,2…,n),隱藏層節(jié)點(diǎn)為j(j=1,2,…,l),輸出層為k(k=1,2,…m),初始設(shè)定輸入層到隱藏層的權(quán)重wij,隱藏層到輸出層wjk,輸出層到隱藏層的閥值aj,隱藏層到輸出層的閥值bk。
2)計(jì)算隱藏層的輸出式見式(1),其中g(shù)(x)為Sigmoid激勵(lì)函數(shù)。
(1)
3)計(jì)算輸出層的輸出式為:
(2)
4)誤差e計(jì)算公式見式(3),式中ΔYk為期望輸出。
(3)
ek=ΔYk-Yk
(4)
5)判斷相鄰2個(gè)誤差的差別是否小于期望值,若是則保存權(quán)重和閥值,否則,將進(jìn)行權(quán)重和閥值的更新,見式(5)~(8),直到達(dá)到期望值或者指定的迭代次數(shù)為止。式中,η為學(xué)習(xí)效率。
(5)
wjk=wjk+ηHjek
(6)
(7)
bk=bk+ηek
(8)
由上面BP算法流程可以看出權(quán)重和閥值是本算法的關(guān)鍵。在實(shí)際運(yùn)算過程中,初始選取的權(quán)重和閥值,將直接影響最后運(yùn)算效率。由于BP算法受梯度下降學(xué)習(xí)法的影響,在更新最優(yōu)權(quán)值時(shí)容易陷入局部極小值,在實(shí)際運(yùn)算過程中容易陷入運(yùn)算僵局,無法得出結(jié)果。因此,有必須對權(quán)重和閥值在全局上得到優(yōu)化,即可以避免陷入局部極小值,也可以大大提高運(yùn)算效率和精確度。
DA是MIRJALILI等[8]提出的一種新型群智能尋優(yōu)算法,它是通過模擬蜻蜓群體飛行導(dǎo)航、捕獵和躲避天敵等行為對全局和局部同時(shí)進(jìn)行搜尋,尋找最佳捕獵行為的算法尋優(yōu)過程。蜻蜓群體的運(yùn)動可以分以下5種行為。
1)分離行為,指單個(gè)蜻蜓與相鄰蜻蜓之間的分離情況,其行為表達(dá)式為
(9)
式中:Si是蜻蜓i與相鄰蜻蜓的分離度;X為當(dāng)前蜻蜓所在的位置;Xj為相鄰蜻蜓j的位置;N為相鄰蜻蜓的數(shù)目。
2)對齊行為,表示單個(gè)蜻蜓與相鄰蜻蜓的速度匹配,其行為表達(dá)式為
(10)
式中:Ai是蜻蜓i與相鄰蜻蜓的對齊度;Vj為相鄰蜻蜓的速度。
3)內(nèi)聚行為,表示單個(gè)蜻蜓與相鄰蜻蜓的集體聚攏,其行為表達(dá)式為
(11)
式中:Ci是蜻蜓i的內(nèi)聚度。
4)覓食行為,指單個(gè)蜻蜓尋找食物,其行為表達(dá)式為
Fi=X+-X
(12)
式中:Fi表示蜻蜓i的覓食能力;X+為食物所在位置。
5)避敵行為,表示單個(gè)蜻蜓躲避外敵行為,其行為表達(dá)式為
Ei=X-+X
(13)
式中:Ei表示蜻蜓i的避敵能力;X-表示敵人所在的位置。
DA算法就是在更新蜻蜓位置的算法,有2種情況發(fā)生。
第1種,當(dāng)蜻蜓有近鄰時(shí),蜻蜓可以通過以上5種行為方式來尋找飛行方向ΔX和空中位置X,并對方向和位置更迭變化,最終尋找最佳的結(jié)果。t+1是t的下一代,其位置和方向迭代更新的表達(dá)式:
Xt+1=Xt+ΔXt+1
(14)
ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+ΔwΔXt
(15)
式中:s為分離權(quán)重;a為對齊權(quán)重;c為內(nèi)聚權(quán)重;f為覓食因子;e為天敵因子;Δw為慣性權(quán)重。
第2種,蜻蜓無近鄰,利用Lévy()函數(shù)更新蜻蜓位置,從而找到群體。Lévy()函數(shù)表達(dá)式如下:
(16)
(17)
式中:τ(x)=(x-1)!;β=0.5的常量;r1,r2為0到1之間的隨機(jī)數(shù)。蜻蜓位置更新數(shù)學(xué)表達(dá)式如下:
Xt+1=Xt+Lévy(d)ΔXt
(18)
式中:d為維度。
從以上可以看出DA算法具有較好的全局搜索能力,可以幫助BP神經(jīng)網(wǎng)絡(luò)算法將權(quán)重與閥值得到全局優(yōu)化。但是它依然有缺點(diǎn),因?yàn)轵唑褌€(gè)體之間沒有過多的信息交流,每代的尋優(yōu)沒有充分利用上代的優(yōu)秀個(gè)體,影響算法的收斂,容易出現(xiàn)過早收斂。
為了避免DA算法收斂情況,采用多精英位置組合策略實(shí)現(xiàn)個(gè)體增強(qiáng)的DA算法,稱為EIDA算法。采取的策略是選擇新位置矩陣時(shí),選中前3個(gè)最優(yōu)秀個(gè)體,利用混沌映射隨機(jī)性進(jìn)行混沌線性組合。由于混沌的非周期性和遍歷性,使得優(yōu)化的線性組合能在已知最優(yōu)秀個(gè)體附近進(jìn)行局部尋找,這樣就能充分利用上代優(yōu)秀個(gè)體,極大地提高全局搜索的能力,避免過早收斂。
在解空間中N個(gè)蜻蜓在第t次迭代的位置矩陣為Xt=(Xt1,Xt2,…XtN),而其對應(yīng)的適應(yīng)值矩陣Qt=(Qt1,Qt2,…,QtN)每次進(jìn)行迭代時(shí),都會對應(yīng)地構(gòu)造增廣位置矩陣XSt,QSt,并對增廣矩陣建立QSt→XSt的排序映射,當(dāng)排序結(jié)束后,把XSt中N個(gè)體構(gòu)成新的位置矩陣XNt。
(19)
式中:rt為基于Cubic混沌映射的優(yōu)化算子。
(20)
使用混沌優(yōu)化的線性組合能不僅可以提高解的精確度,而且還能提高算法后期的收斂速度。
運(yùn)用EIDA全局優(yōu)化能力,對BP神經(jīng)網(wǎng)絡(luò)算法進(jìn)行優(yōu)化,具體步驟如下。
步驟1 初始化以下參數(shù):蜻蜓算法種群規(guī)模N;最大迭代次數(shù)M;空間維度d;慣性權(quán)重Δw;領(lǐng)域半徑為r,蜻蜓5種行為權(quán)值s,a,c,f,e,BP神經(jīng)網(wǎng)絡(luò)的權(quán)值w、閥值φ等。
步驟2 將BP網(wǎng)絡(luò)的權(quán)值w、閥值φ進(jìn)行排序,組成行向量(w,φ),使之成為蜻蜓算法的位置X,根據(jù)權(quán)值、閥值的取值范圍生成初始化位置X,同時(shí)也隨機(jī)生成初始化飛行方向ΔX。
步驟3 計(jì)算個(gè)體蜻蜓的適應(yīng)度。當(dāng)?shù)螖?shù)t>1時(shí),建立上一代迭代的蜻蜓位置與當(dāng)前蜻蜓位置的排序映射,通過蜻蜓個(gè)體適應(yīng)度值,求得上代和本代得優(yōu)秀蜻蜓個(gè)體,并記錄當(dāng)前最優(yōu)個(gè)體位置X,這里X也就是BP 神經(jīng)網(wǎng)絡(luò)的權(quán)值w、閥值φ。
步驟4 利用歐氏距離公式算出當(dāng)前最優(yōu)解為食物位置X+和當(dāng)前最差解為敵人位置X-,并對5種行為權(quán)值s,a,c,f,e和慣性權(quán)重w進(jìn)行更新。運(yùn)用公式(9)~(13)重新調(diào)整S,A,C,F(xiàn),E的值。
步驟5 判斷領(lǐng)域半徑內(nèi)是否有其他蜻蜓,如有利用公式(14)、(15)更新位置向量X和方向向量ΔX;若沒有其他蜻蜓,則利用公式(18)更新位置向量X。
步驟6 利用公式(19)和(20)對蜻蜓位置進(jìn)行混沌優(yōu)化的線性組合。
步驟7 是否滿足最大迭代數(shù),若是,則停止運(yùn)算;若不是,則當(dāng)前的迭代次數(shù)加1并跳轉(zhuǎn)步驟3。
本次實(shí)驗(yàn)數(shù)據(jù)來自安徽統(tǒng)計(jì)局官方網(wǎng)站歷年統(tǒng)計(jì)年鑒,在2012—2017年之間安徽省亳州市各地區(qū)的小麥種植數(shù)據(jù)。亳州作為安徽小麥主產(chǎn)區(qū),自2012年成為全省首個(gè)小麥畝產(chǎn)千斤市以來,小麥種植管理配套齊全,農(nóng)作物數(shù)據(jù)完備。實(shí)驗(yàn)分為2個(gè)部分:第一部分是在Spark和Hadoop這2個(gè)不同框架下對影響農(nóng)作物產(chǎn)量因素?cái)?shù)據(jù)做數(shù)據(jù)預(yù)處理,并用改進(jìn)的DA-BP神經(jīng)網(wǎng)絡(luò)對小麥產(chǎn)量進(jìn)行預(yù)測;第二部分是在Spark框架下對數(shù)據(jù)預(yù)處理,運(yùn)用本文改進(jìn)的DA-BP算法與PSO-BP和BP算法進(jìn)行對比分析。
實(shí)驗(yàn)環(huán)境是以1臺為Master節(jié)點(diǎn),若干臺為Slave節(jié)點(diǎn),搭建Spark集群框架和Hadoop集群框架。所有節(jié)點(diǎn)機(jī)具有CUP i3 2.75 GHz 、內(nèi)存4 G配置,使用linux操作系統(tǒng)。服務(wù)平臺配置為ThinkServer RD650,處理器類型E5-2609v4,內(nèi)存16 GB,硬盤1 T。
本實(shí)驗(yàn)是為了體現(xiàn)Spark和Hadoop不同框架下對數(shù)據(jù)處理能力,在同樣的實(shí)驗(yàn)環(huán)境中先后架構(gòu)Spark和Hadoop平臺,對0.5 GB到200 GB的數(shù)據(jù)進(jìn)行預(yù)處理。將不同平臺下的數(shù)據(jù)處理效率進(jìn)行對比,結(jié)果見圖2。
圖2 Spark和Hadoop框架下不同數(shù)據(jù)量的運(yùn)算時(shí)間Fig.2 Computing time of different data volumes under Spark and Hadoop frameworks
從圖2可以看出:在Spark和Hadoop不同框架下,隨著數(shù)據(jù)量增加,Spark平臺下的數(shù)據(jù)處理用時(shí)明顯要比Hadoop平臺下的少。這是因?yàn)镾park是基于內(nèi)存計(jì)算的,而Hadoop是基于磁盤計(jì)算的。在Spark平臺中,計(jì)算所產(chǎn)生的中間值和結(jié)果寫入內(nèi)存數(shù)據(jù)集RDD中,減少了磁盤數(shù)據(jù)傳輸?shù)拈_銷,同時(shí)依靠RDD間的轉(zhuǎn)換依賴關(guān)系,在很大程度上提高了數(shù)據(jù)容錯(cuò)性。所以,數(shù)據(jù)量越大,Spark平臺下的數(shù)據(jù)處理能力越優(yōu)于Hadoop平臺的數(shù)據(jù)處理能力。
圖3 三種算法均方誤差(MSE)收斂比較Fig.3 Convergence comparison of mean square error(MSE)of the three algorithms
根據(jù)本文前面所述影響農(nóng)作物產(chǎn)量的8個(gè)因素,可以確定輸入層的神經(jīng)元個(gè)數(shù)是8,而對小麥產(chǎn)量預(yù)測的輸出層神經(jīng)元為1。本實(shí)驗(yàn)將EIDA-BP算法與PSO-BP算法和BP算法進(jìn)行比較。在EIDA-BP算法中,蜻蜓種群數(shù)量為20,最大迭代次數(shù)為60次,權(quán)值和閥值取值范圍為[-1,1]。在PSO-BP算法中,步伐因子C1=C2=1.86,初始和最大慣性權(quán)值分別設(shè)定為Win=0.8,Wmax=0.4,最大速度Vmax=0.6。采用標(biāo)準(zhǔn)BP算法進(jìn)行。在實(shí)驗(yàn)過程中,為了準(zhǔn)確地反映3種算法的速度,將3種算法在運(yùn)算過程中的均方誤差(MSE)收斂走勢進(jìn)行比較,如圖3所示。
從圖3可以看出:EIDA-BP算法均方誤差最小,最接近理論值;EIDA-BP算法和PSO-BP算法收斂速度比BP算法要快,這是因?yàn)锽P在沒有其他算法優(yōu)化的時(shí)候,容易導(dǎo)致初始化權(quán)值和閥值不當(dāng),這將大大降低BP算法的速度。不管是PSO優(yōu)化還是EIDA優(yōu)化,它們的目的都是選出全局最優(yōu)權(quán)值和閥值,在提高效率的同時(shí)也避免局部極小值發(fā)生。EIDA-BP算法比PSO-BP算法的均方誤差還要小,是因?yàn)镋IDA 的收斂精度和尋優(yōu)能力都高于PSO-BP算法,且PSO-BP算法存在過早收斂的情況。
最后用3種算法對亳州各區(qū)小麥產(chǎn)量預(yù)測,預(yù)測的精確度和期間算出的MSE比較如表1所示。
表1 3種算法精確度和最佳MSE對比
Table 1 Comparison of accuracy and optimal MSE of the three algorithms
參數(shù)算法EIDA-BP算法PSO-BP算法BP算法最佳MSE0.01630.01890.0227精確度/%98.394.688.0
從表1可見:EIDA-BP算法的精確度明顯高于其他算法,同時(shí)最佳MSE也是最小的,接近理論值。
本文通過先Spark框架對影響農(nóng)作物產(chǎn)量因素?cái)?shù)據(jù)做數(shù)據(jù)預(yù)處理,再用EIDA-BP算法對2012—2017年安徽亳州小麥產(chǎn)量進(jìn)行預(yù)測。在實(shí)驗(yàn)過程中發(fā)現(xiàn)Spark框架比Hadoop框架下數(shù)據(jù)處理速度快很多,EIDA-BP算法比PSO-BP算法和BP算法精確度更高。因此,采用基于Spark框架的EIDA-BP算法對農(nóng)作物產(chǎn)量進(jìn)行預(yù)測具有一定的意義,可以為農(nóng)業(yè)信息化建設(shè)提供可靠支持。