LTSM 實(shí)現(xiàn)多元素時(shí)序數(shù)據(jù)植物健康預(yù)測(cè)
引言:
近些年來(lái),“預(yù)測(cè)”一詞在各個(gè)領(lǐng)域被頻繁提及,所謂預(yù)測(cè),實(shí)際上就是根據(jù)歷史規(guī)律,推測(cè)未來(lái)結(jié)果。在科學(xué)技術(shù)發(fā)展有限的過(guò)去,預(yù)測(cè)主要是利用經(jīng)驗(yàn)去推測(cè)未來(lái),隨著社會(huì)的發(fā)展,對(duì)預(yù)測(cè)的客觀性和準(zhǔn)確性提出了更高的要求,簡(jiǎn)單的經(jīng)驗(yàn)推理已無(wú)法滿足社會(huì)的需求。近幾十年來(lái),隨著人工智能技術(shù)的發(fā)展,出現(xiàn)了新型的預(yù)測(cè)方法,人工神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)技術(shù)正是其中佼佼者。人工神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)技術(shù)一經(jīng)面世就展現(xiàn)了它相比傳統(tǒng)預(yù)測(cè)方法的優(yōu)勢(shì):精度高、速度快,隨著人工神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)技術(shù)研究的深入,逐漸發(fā)展出性能更優(yōu)的復(fù)雜網(wǎng)絡(luò),如 BP、CP 和 ART 網(wǎng)絡(luò)等。
目前最常用的是 BP 神經(jīng)網(wǎng)絡(luò),由于它結(jié)構(gòu)簡(jiǎn)單、易于使用,被廣泛應(yīng)用于天氣預(yù)報(bào)、證券投資市場(chǎng)等領(lǐng)域。但是由于 BP 神經(jīng)網(wǎng)絡(luò)不能很好的解決時(shí)間序列問(wèn)題,為此發(fā)展出了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),但是經(jīng)過(guò)使用發(fā)現(xiàn) RNN 容易出現(xiàn)“梯度消失”和“梯度爆炸”問(wèn)題,為了解決這類問(wèn)題,基于人腦的遺忘機(jī)制,Sepp Hochreiter 提出了 LSTM 神經(jīng)網(wǎng)絡(luò)。
LSTM 繼承了大部分 RNN 的優(yōu)點(diǎn),同時(shí)解決了“梯度消失”和“梯度爆炸”問(wèn)題,它更真實(shí)地表征或模擬了人類行為、邏輯發(fā)展和神經(jīng)組織的認(rèn)知過(guò)程。LSTM 非常適合處理與時(shí)間序列高度相關(guān)的問(wèn)題,在長(zhǎng)周期時(shí)間依賴問(wèn)題上的潛力無(wú)窮。得益于 LSTM 的各類優(yōu)點(diǎn),應(yīng)用 LSTM 模型對(duì)具有時(shí)序性的事物進(jìn)行預(yù)測(cè)具有實(shí)際意義。
故今天我們將使用keras搭建LSTM實(shí)現(xiàn)多元參數(shù)進(jìn)行時(shí)序數(shù)據(jù)的預(yù)測(cè),應(yīng)用于農(nóng)業(yè)健康狀況預(yù)測(cè),模型200輪擬合效果如下:
01 LSTM 算法介紹
長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)是在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的基礎(chǔ)上添加各種“門”控制,實(shí)現(xiàn)對(duì)數(shù)據(jù)的記憶功能,以此來(lái)解決長(zhǎng)時(shí)間依賴問(wèn)題。LSTM 也被稱作特殊的 RNN,現(xiàn)在被廣泛的使用在文本生成、語(yǔ)音識(shí)別、時(shí)間序列預(yù)測(cè)等方面。2014 年以來(lái),LSTM 已經(jīng)成為非常熱點(diǎn)的研究模型,得到大量的關(guān)注和研究。國(guó)內(nèi)外學(xué)者利用 LSTM 模型進(jìn)行預(yù)測(cè)應(yīng)用研究已經(jīng)取得了一系列的成果,Alahi等人提出了一種可以學(xué)習(xí)人類運(yùn)動(dòng)并預(yù)測(cè)未來(lái)軌跡的 LSTM 模型,將此模型應(yīng)用于公共數(shù)據(jù)集上,預(yù)測(cè)結(jié)果優(yōu)于當(dāng)時(shí)最先進(jìn)的方法;Ma等人首次將 LSTM 模型運(yùn)用于交通預(yù)測(cè)中,為了驗(yàn)證 LSTM 神經(jīng)網(wǎng)絡(luò)的有效性,基于北京市兩個(gè)微波探測(cè)器采集的數(shù)據(jù)進(jìn)行試驗(yàn),通過(guò)與傳統(tǒng)的 RNN 模型比較,發(fā)現(xiàn) LSTM 神經(jīng)網(wǎng)絡(luò)在預(yù)測(cè)精度和穩(wěn)定性方面都達(dá)到了最好的效果;Zhang等人基于 LSTM 提出了一種改進(jìn)的時(shí)間特征提取算法,簡(jiǎn)稱 Read-first LSTM 或RLSTM,作者將該模型應(yīng)用于空氣污染物預(yù)測(cè)上,實(shí)驗(yàn)表明該模型預(yù)測(cè)效果良好;陳卓等人提出一種基于 LSTM 的電力負(fù)荷預(yù)測(cè)方法,使用這該方法對(duì)某地電力負(fù)荷值進(jìn)行預(yù)測(cè),將預(yù)測(cè)結(jié)果與傳統(tǒng)模型對(duì)比,最終證明 LSTM 模型的誤差更低,預(yù)測(cè)效果更好;王旭東等人針對(duì)短期家庭電力數(shù)據(jù)隨機(jī)性強(qiáng),數(shù)據(jù)維度低等問(wèn)題,提出了一種基于 LSTM 的單變量短期家庭電力需求預(yù)測(cè)模型,實(shí)驗(yàn)表明該模型能夠準(zhǔn)確地預(yù)測(cè)家庭電力需求趨勢(shì),且優(yōu)于傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)。
1.1 LSTM原理
LSTM 可以根據(jù)時(shí)間序列對(duì)輸入的信息進(jìn)行分析。換句話說(shuō),我們利用前饋神經(jīng)網(wǎng)絡(luò)時(shí),它會(huì)認(rèn)為當(dāng)前時(shí)刻輸入的信息與下一時(shí)刻輸入的內(nèi)容沒(méi)有關(guān)系;在利用RNN 神經(jīng)網(wǎng)絡(luò)時(shí),因?yàn)?RNN 存在著梯度消失、梯度爆炸和無(wú)法有效處理長(zhǎng)周期數(shù)據(jù)依賴問(wèn)題的特點(diǎn),所以前輩們提出新的算法—LSTM 算法。使用 LSTM 可以有目的地傳遞和表達(dá)長(zhǎng)時(shí)間序列中的內(nèi)容并且避免引起歷史信息的丟失。
與 RNN 比較,LSTM 多了三個(gè)門,它利用三個(gè)門對(duì)保留的信息進(jìn)行控制,確保保留的信息是算法需要的,對(duì)于垃圾信息則拒之門外。這三個(gè)門分別是輸入門、遺忘門、輸出門。三個(gè)門作用不同,相互合作,達(dá)到最佳效果。
02 植物健康狀況預(yù)測(cè)
農(nóng)業(yè)是我國(guó)國(guó)民經(jīng)濟(jì)的重要支柱,傳統(tǒng)的農(nóng)業(yè)由于降雨和氣候等因素的制約,會(huì)對(duì)其產(chǎn)量和品質(zhì)造成一定的影響,減少了農(nóng)業(yè)產(chǎn)業(yè)的經(jīng)濟(jì)利益。為實(shí)現(xiàn)經(jīng)濟(jì)利益最大化,提高農(nóng)作物產(chǎn)量,發(fā)展智能化農(nóng)業(yè)等問(wèn)題,需從本質(zhì)上解決,即對(duì)作物的生理信息的傳輸進(jìn)行研究。而作為智能農(nóng)業(yè)的未來(lái)發(fā)展,其必然需要數(shù)據(jù)預(yù)測(cè)的部分,故本項(xiàng)目將針對(duì)農(nóng)業(yè)農(nóng)作物影響參數(shù)溫度、濕度等因素的歷史數(shù)據(jù)進(jìn)行未來(lái)狀況的預(yù)測(cè)。
這里程序的設(shè)計(jì)分為以下幾個(gè)步驟,分別為數(shù)據(jù)集預(yù)處理、LSTM模型訓(xùn)練和模型測(cè)試。
2.1 農(nóng)作物歷史數(shù)據(jù)預(yù)處理
這里我們將系統(tǒng)記錄的農(nóng)作物歷史影響因素的數(shù)值轉(zhuǎn)為csv文件,并將其轉(zhuǎn)為英文,防止中文亂碼的發(fā)生。
通過(guò)read_csv函數(shù)讀取csv文件后,獲取其中每列數(shù)據(jù)作為每個(gè)元素。然后對(duì)讀取的數(shù)據(jù)進(jìn)行MinmaxScaler標(biāo)準(zhǔn)化,目的是為了加速模型的收斂,同時(shí)還有可能提高模型精度。然后把數(shù)據(jù)轉(zhuǎn)為監(jiān)督學(xué)習(xí)數(shù)據(jù)。代碼如下:
dataset = read_csv('sate.csv', header=0, index_col=0) values = dataset.values encoder = LabelEncoder() values = values.astype('float32') scaler = MinMaxScaler(feature_range=(0, 1)) scaled = scaler.fit_transform(values) reframed = series_to_supervised(scaled, 1, 1) print(scaled.shape) values = reframed.values n_train_hours = 365 * 24 train = values[:n_train_hours, :] test = values[n_train_hours:, :] train_X, train_y = train[:, :-1], train[:, -1] test_X, test_y = test[:, :-1], test[:, -1] train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1])) test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) def series_to_supervised(data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] df = DataFrame(data) cols, names = list(), list() for i in range(n_in, 0, -1): cols.append(df.shift(i)) names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)] for i in range(0, n_out): cols.append(df.shift(-i)) if i == 0: names += [('var%d(t)' % (j+1)) for j in range(n_vars)] else: names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)] agg = concat(cols, axis=1) agg.columns = names if dropnan: agg=agg.fillna(0) return agg
2.2 LSTM模型訓(xùn)練
這里設(shè)置LSTM層神經(jīng)元50,設(shè)置損失為MAE平均絕對(duì)誤差,優(yōu)化器為adam優(yōu)化器,迭代次數(shù)為200輪,batch_size為72,隨機(jī)打亂數(shù)據(jù)進(jìn)行訓(xùn)練,并最后進(jìn)行模型的保存,并將其損失圖繪制。代碼如下:
model = Sequential() model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2]))) model.add(Dense(1)) model.compile(los='mae', optimizer='adam') history = model.fit(train_X, train_y, epochs=200, batch_size=72, validation_data=(train_X, train_y), verbose=2, shuffle=False) pyplot.plot(history.history['loss'], label='train') pyplot.plot(history.history['val_loss'], label='test') pyplot.legend() pyplot.show()
model.save("model.h5")
2.3 模型測(cè)試
從設(shè)置的農(nóng)業(yè)系統(tǒng)中獲取環(huán)境參數(shù)后,將參數(shù)輸入模型,即可實(shí)現(xiàn)預(yù)測(cè)。代碼如下:
while True: elements=['health','temperature','humidity','light_intensity','soil_temperature','soil_humidity','co2','rain'] i=0 if i%1==0: input_list=spider() input_data = DataFrame([input_list], columns=elements) dataset=dataset.append(input_data) values = dataset.values encoder = LabelEncoder() values = values.astype('float32') scaler = MinMaxScaler(feature_range=(0, 1)) scaled = scaler.fit_transform(values) reframed = series_to_supervised(scaled, 1, 1) values = reframed.values test_X= values[:, :-1] test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) y_predict = model.predict(np.array([test_X[-1]])) print(input_data.values[0][1:]) print("預(yù)測(cè)污染程度為:"+str(y_predict[0][0]))
完整代碼:
鏈接:
https://pan.baidu.com/s/1tpT0_K-csVX8fRYd-PPJCg
提取碼:1rb8
李秋鍵,CSDN博客專家,CSDN達(dá)人課作者。碩士在讀于中國(guó)礦業(yè)大學(xué),開(kāi)發(fā)有taptap競(jìng)賽獲獎(jiǎng)等。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
汽車防盜機(jī)相關(guān)文章:汽車防盜機(jī)原理