博客專欄

EEPW首頁 > 博客 > LTSM 實現(xiàn)多元素時序數(shù)據(jù)植物健康預(yù)測

LTSM 實現(xiàn)多元素時序數(shù)據(jù)植物健康預(yù)測

發(fā)布人:AI科技大本營 時間:2021-12-15 來源:工程師 發(fā)布文章

引言:

近些年來,“預(yù)測”一詞在各個領(lǐng)域被頻繁提及,所謂預(yù)測,實際上就是根據(jù)歷史規(guī)律,推測未來結(jié)果。在科學(xué)技術(shù)發(fā)展有限的過去,預(yù)測主要是利用經(jīng)驗去推測未來,隨著社會的發(fā)展,對預(yù)測的客觀性和準(zhǔn)確性提出了更高的要求,簡單的經(jīng)驗推理已無法滿足社會的需求。近幾十年來,隨著人工智能技術(shù)的發(fā)展,出現(xiàn)了新型的預(yù)測方法,人工神經(jīng)網(wǎng)絡(luò)預(yù)測技術(shù)正是其中佼佼者。人工神經(jīng)網(wǎng)絡(luò)預(yù)測技術(shù)一經(jīng)面世就展現(xiàn)了它相比傳統(tǒng)預(yù)測方法的優(yōu)勢:精度高、速度快,隨著人工神經(jīng)網(wǎng)絡(luò)預(yù)測技術(shù)研究的深入,逐漸發(fā)展出性能更優(yōu)的復(fù)雜網(wǎng)絡(luò),如 BP、CP 和 ART 網(wǎng)絡(luò)等。

目前最常用的是 BP 神經(jīng)網(wǎng)絡(luò),由于它結(jié)構(gòu)簡單、易于使用,被廣泛應(yīng)用于天氣預(yù)報、證券投資市場等領(lǐng)域。但是由于 BP 神經(jīng)網(wǎng)絡(luò)不能很好的解決時間序列問題,為此發(fā)展出了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),但是經(jīng)過使用發(fā)現(xiàn) RNN 容易出現(xiàn)“梯度消失”和“梯度爆炸”問題,為了解決這類問題,基于人腦的遺忘機(jī)制,Sepp Hochreiter 提出了 LSTM 神經(jīng)網(wǎng)絡(luò)。

LSTM 繼承了大部分 RNN 的優(yōu)點,同時解決了“梯度消失”和“梯度爆炸”問題,它更真實地表征或模擬了人類行為、邏輯發(fā)展和神經(jīng)組織的認(rèn)知過程。LSTM 非常適合處理與時間序列高度相關(guān)的問題,在長周期時間依賴問題上的潛力無窮。得益于 LSTM 的各類優(yōu)點,應(yīng)用 LSTM 模型對具有時序性的事物進(jìn)行預(yù)測具有實際意義。

故今天我們將使用keras搭建LSTM實現(xiàn)多元參數(shù)進(jìn)行時序數(shù)據(jù)的預(yù)測,應(yīng)用于農(nóng)業(yè)健康狀況預(yù)測,模型200輪擬合效果如下: 

1.png

01 LSTM 算法介紹

長短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)是在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的基礎(chǔ)上添加各種“門”控制,實現(xiàn)對數(shù)據(jù)的記憶功能,以此來解決長時間依賴問題。LSTM 也被稱作特殊的 RNN,現(xiàn)在被廣泛的使用在文本生成、語音識別、時間序列預(yù)測等方面。2014 年以來,LSTM 已經(jīng)成為非常熱點的研究模型,得到大量的關(guān)注和研究。國內(nèi)外學(xué)者利用 LSTM 模型進(jìn)行預(yù)測應(yīng)用研究已經(jīng)取得了一系列的成果,Alahi等人提出了一種可以學(xué)習(xí)人類運動并預(yù)測未來軌跡的 LSTM 模型,將此模型應(yīng)用于公共數(shù)據(jù)集上,預(yù)測結(jié)果優(yōu)于當(dāng)時最先進(jìn)的方法;Ma等人首次將 LSTM 模型運用于交通預(yù)測中,為了驗證 LSTM 神經(jīng)網(wǎng)絡(luò)的有效性,基于北京市兩個微波探測器采集的數(shù)據(jù)進(jìn)行試驗,通過與傳統(tǒng)的 RNN 模型比較,發(fā)現(xiàn) LSTM 神經(jīng)網(wǎng)絡(luò)在預(yù)測精度和穩(wěn)定性方面都達(dá)到了最好的效果;Zhang等人基于 LSTM 提出了一種改進(jìn)的時間特征提取算法,簡稱 Read-first LSTM 或RLSTM,作者將該模型應(yīng)用于空氣污染物預(yù)測上,實驗表明該模型預(yù)測效果良好;陳卓等人提出一種基于 LSTM 的電力負(fù)荷預(yù)測方法,使用這該方法對某地電力負(fù)荷值進(jìn)行預(yù)測,將預(yù)測結(jié)果與傳統(tǒng)模型對比,最終證明 LSTM 模型的誤差更低,預(yù)測效果更好;王旭東等人針對短期家庭電力數(shù)據(jù)隨機(jī)性強(qiáng),數(shù)據(jù)維度低等問題,提出了一種基于 LSTM 的單變量短期家庭電力需求預(yù)測模型,實驗表明該模型能夠準(zhǔn)確地預(yù)測家庭電力需求趨勢,且優(yōu)于傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)。

1.1 LSTM原理

LSTM 可以根據(jù)時間序列對輸入的信息進(jìn)行分析。換句話說,我們利用前饋神經(jīng)網(wǎng)絡(luò)時,它會認(rèn)為當(dāng)前時刻輸入的信息與下一時刻輸入的內(nèi)容沒有關(guān)系;在利用RNN 神經(jīng)網(wǎng)絡(luò)時,因為 RNN 存在著梯度消失、梯度爆炸和無法有效處理長周期數(shù)據(jù)依賴問題的特點,所以前輩們提出新的算法—LSTM 算法。使用 LSTM 可以有目的地傳遞和表達(dá)長時間序列中的內(nèi)容并且避免引起歷史信息的丟失。

與 RNN 比較,LSTM 多了三個門,它利用三個門對保留的信息進(jìn)行控制,確保保留的信息是算法需要的,對于垃圾信息則拒之門外。這三個門分別是輸入門、遺忘門、輸出門。三個門作用不同,相互合作,達(dá)到最佳效果。

2.png

02 植物健康狀況預(yù)測

農(nóng)業(yè)是我國國民經(jīng)濟(jì)的重要支柱,傳統(tǒng)的農(nóng)業(yè)由于降雨和氣候等因素的制約,會對其產(chǎn)量和品質(zhì)造成一定的影響,減少了農(nóng)業(yè)產(chǎn)業(yè)的經(jīng)濟(jì)利益。為實現(xiàn)經(jīng)濟(jì)利益最大化,提高農(nóng)作物產(chǎn)量,發(fā)展智能化農(nóng)業(yè)等問題,需從本質(zhì)上解決,即對作物的生理信息的傳輸進(jìn)行研究。而作為智能農(nóng)業(yè)的未來發(fā)展,其必然需要數(shù)據(jù)預(yù)測的部分,故本項目將針對農(nóng)業(yè)農(nóng)作物影響參數(shù)溫度、濕度等因素的歷史數(shù)據(jù)進(jìn)行未來狀況的預(yù)測。

這里程序的設(shè)計分為以下幾個步驟,分別為數(shù)據(jù)集預(yù)處理、LSTM模型訓(xùn)練和模型測試。

2.1 農(nóng)作物歷史數(shù)據(jù)預(yù)處理

這里我們將系統(tǒng)記錄的農(nóng)作物歷史影響因素的數(shù)值轉(zhuǎn)為csv文件,并將其轉(zhuǎn)為英文,防止中文亂碼的發(fā)生。

3.png

通過read_csv函數(shù)讀取csv文件后,獲取其中每列數(shù)據(jù)作為每個元素。然后對讀取的數(shù)據(jù)進(jìn)行MinmaxScaler標(biāo)準(zhǔn)化,目的是為了加速模型的收斂,同時還有可能提高模型精度。然后把數(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

4.png

2.2 LSTM模型訓(xùn)練

這里設(shè)置LSTM層神經(jīng)元50,設(shè)置損失為MAE平均絕對誤差,優(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")

5.png

2.3 模型測試

從設(shè)置的農(nóng)業(yè)系統(tǒng)中獲取環(huán)境參數(shù)后,將參數(shù)輸入模型,即可實現(xiàn)預(yù)測。代碼如下:

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ù)測污染程度為:"+str(y_predict[0][0]))

6.png

完整代碼:

鏈接:

https://pan.baidu.com/s/1tpT0_K-csVX8fRYd-PPJCg

提取碼:1rb8

李秋鍵,CSDN博客專家,CSDN達(dá)人課作者。碩士在讀于中國礦業(yè)大學(xué),開發(fā)有taptap競賽獲獎等。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

汽車防盜機(jī)相關(guān)文章:汽車防盜機(jī)原理


關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉