【房價預測】基於matlab Elman神經網路房價預測【含Matlab原始碼 589期】
阿新 • • 發佈:2021-06-26
一、簡介
1 Elman網路特點
Elman神經網路是一種典型的動態遞迴神經網路,它是在BP網路基本結構的基礎上,在隱含層增加一個承接層,作為一步延時運算元,達到記憶的目的,從而使系統具有適應時變特性的能力,增強了網路的全域性穩定性,它比前饋型神經網路具有更強的計算能力,還可以用來解決快速尋優問題。
2 Elman網路結構
Elman神經網路是應用較為廣泛的一種典型的反饋型神經網路模型。一般分為四層:輸入層、隱層、承接層和輸出層。其輸入層、隱層和輸出層的連線類似於前饋網路。輸入層的單元僅起到訊號傳輸作用,輸出層單元起到加權作用。隱層單元有線性和非線性兩類激勵函式,通常激勵函式取Signmoid非線性函式。而承接層則用來記憶隱層單元前一時刻的輸出值,可以認為是一個有一步遲延的延時運算元。隱層的輸出通過承接層的延遲與儲存,自聯到隱層的輸入,這種自聯方式使其對歷史資料具有敏感性,內部反饋網路的加入增加了網路本身處理動態資訊的能力,從而達到動態建模的目的。其結構圖如下圖1所示,
其網路的數學表示式為:
3 Elman網路與BP網路的區別
它是動態反饋型網路,它能夠內部反饋、儲存和利用過去時刻輸出資訊,既可以實現靜態系統的建模,還能實現動態系統的對映並直接反應系統的動態特性,在計算能力及網路穩定性方面都比BP神經網路更勝一籌。
4 Elman網路缺點
與BP神經網路一樣,演算法都是採用基於梯度下降法,會出現訓練速度慢和容易陷入區域性極小點的缺點,對神經網路的訓練較難達到全域性最優。
二、原始碼
% elm_stockpredict.m %% 清除工作空間中的變數和圖形 clear,clc close all %% 1.載入337期上證指數開盤價格 load matlab.mat whos rng(1) %% ARMA模型 z=iddata(y1); m=armax(z(1:19),'na',2,'nc',1); yp = predict(m,y1,1); yp=yp'; yp=yp(:,157:end); %% 2.構造樣本集 % 資料個數 price=y1; n=length(price); % 確保price為列向量 price=price(:); % x(n) 由x(n-1),x(n-2),...,x(n-L)共L個數預測得到. L = 6; % price_n:每列為一個構造完畢的樣本,共n-L個樣本 price_n = zeros(L+1, n-L); for i=1:n-L price_n(:,i) = price(i:i+L); end %% 劃分訓練、測試樣本 % 將前280份資料劃分為訓練樣本 % 後51份資料劃分為測試樣本 trainx = price_n(1:6, 1:150); trainy = price_n(7, 1:150); testx = price_n(1:6, 151:end); testy = price_n(7, 151:end); %% 建立Elman神經網路 % 包含15個神經元,訓練函式為traingdx net=elmannet(1:2,15,'traingdx'); % 設定顯示級別 net.trainParam.show=1; % 最大迭代次數為2000次 net.trainParam.epochs=2000; % 誤差容限,達到此誤差就可以停止訓練 net.trainParam.goal=0.00001; % 最多驗證失敗次數 net.trainParam.max_fail=5; % 對網路進行初始化 net=init(net); %% 網路訓練 %訓練資料歸一化 [trainx1, st1] = mapminmax(trainx); [trainy1, st2] = mapminmax(trainy); % 測試資料做與訓練資料相同的歸一化操作 testx1 = mapminmax('apply',testx,st1); testy1 = mapminmax('apply',testy,st2); % 輸入訓練樣本進行訓練 [net,per] = train(net,trainx1,trainy1); %% 測試。輸入歸一化後的資料,再對實際輸出進行反歸一化 % 將訓練資料輸入網路進行測試 train_ty1 = sim(net, trainx1); train_ty = mapminmax('reverse', train_ty1, st2); % 將測試資料輸入網路進行測試 test_ty1 = sim(net, testx1); test_ty = mapminmax('reverse', test_ty1, st2); % 顯示真實值 plot(x,testy,'b-'); hold on % 顯示神經網路的輸出值 plot(x,test_ty,'r--') % 顯示ARMA的輸出值 plot(x,yp,'k--') legend('real price','prediction price of Elman','prediction price of ARMA') title('Test Results'); % 顯示均方誤差 mse2 = mse(test_ty - testy); fprintf(' Elman_mse = \n %f\n', mse2) mse3 = mse(yp - testy); fprintf(' ARMA_mse = \n %f\n', mse3)
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加1564658423