天天看點

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

一、簡介

1 遺傳算法概述

遺傳算法(Genetic Algorithm,GA)是進化計算的一部分,是模拟達爾文的遺傳選擇和自然淘汰的生物進化過程的計算模型,是一種通過模拟自然進化過程搜尋最優解的方法。該算法簡單、通用,魯棒性強,适于并行處理。

2 遺傳算法的特點和應用

遺傳算法是一類可用于複雜系統優化的具有魯棒性的搜尋算法,與傳統的優化算法相比,具有以下特點:

(1)以決策變量的編碼作為運算對象。傳統的優化算法往往直接利用決策變量的實際值本身來進行優化計算,但遺傳算法是使用決策變量的某種形式的編碼作為運算對象。這種對決策變量的編碼處理方式,使得我們在優化計算中可借鑒生物學中染色體和基因等概念,可以模仿自然界中生物的遺傳和進化激勵,也可以很友善地應用遺傳操作算子。

(2)直接以适應度作為搜尋資訊。傳統的優化算法不僅需要利用目标函數值,而且搜尋過程往往受目标函數的連續性限制,有可能還需要滿足“目标函數的導數必須存在”的要求以确定搜尋方向。遺傳算法僅使用由目标函數值變換來的适應度函數值就可确定進一步的搜尋範圍,無需目标函數的導數值等其他輔助資訊。直接利用目标函數值或個體适應度值也可以将搜尋範圍集中到适應度較高部分的搜尋空間中,進而提高搜尋效率。

(3)使用多個點的搜尋資訊,具有隐含并行性。傳統的優化算法往往是從解空間的一個初始點開始最優解的疊代搜尋過程。單個點所提供的搜尋資訊不多,是以搜尋效率不高,還有可能陷入局部最優解而停滞;遺傳算法從由很多個體組成的初始種群開始最優解的搜尋過程,而不是從單個個體開始搜尋。對初始群體進行的、選擇、交叉、變異等運算,産生出新一代群體,其中包括了許多群體資訊。這些資訊可以避免搜尋一些不必要的點,進而避免陷入局部最優,逐漸逼近全局最優解。

(4) 使用機率搜尋而非确定性規則。傳統的優化算法往往使用确定性的搜尋方法,一個搜尋點到另一個搜尋點的轉移有确定的轉移方向和轉移關系,這種确定性可能使得搜尋達不到最優店,限制了算法的應用範圍。遺傳算法是一種自适應搜尋技術,其選擇、交叉、變異等運算都是以一種機率方式進行的,增加了搜尋過程的靈活性,而且能以較大機率收斂于最優解,具有較好的全局優化求解能力。但,交叉機率、變異機率等參數也會影響算法的搜尋結果和搜尋效率,是以如何選擇遺傳算法的參數在其應用中是一個比較重要的問題。

綜上,由于遺傳算法的整體搜尋政策和優化搜尋方式在計算時不依賴于梯度資訊或其他輔助知識,隻需要求解影響搜尋方向的目标函數和相應的适應度函數,是以遺傳算法提供了一種求解複雜系統問題的通用架構。它不依賴于問題的具體領域,對問題的種類有很強的魯棒性,是以廣泛應用于各種領域,包括:函數優化、組合優化生産排程問題、自動控制

、機器人學、圖像處理(圖像恢複、圖像邊緣特征提取…)、人工生命、遺傳程式設計、機器學習。

3 遺傳算法的基本流程及實作技術

基本遺傳算法(Simple Genetic Algorithms,SGA)隻使用選擇算子、交叉算子和變異算子這三種遺傳算子,進化過程簡單,是其他遺傳算法的基礎。

3.1 遺傳算法的基本流程

通過随機方式産生若幹由确定長度(長度與待求解問題的精度有關)編碼的初始群體;

通過适應度函數對每個個體進行評價,選擇适應度值高的個體參與遺傳操作,适應度低的個體被淘汰;

經遺傳操作(複制、交叉、變異)的個體集合形成新一代種群,直到滿足停止準則(進化代數GEN>=?);

将後代中變現最好的個體作為遺傳算法的執行結果。

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

其中,GEN是目前代數;M是種群規模,i代表種群數量。

3.2 遺傳算法的實作技術

基本遺傳算法(SGA)由編碼、适應度函數、遺傳算子(選擇、交叉、變異)及運作參數組成。

3.2.1 編碼

(1)二進制編碼

二進制編碼的字元串長度與問題所求解的精度有關。需要保證所求解空間内的每一個個體都可以被編碼。

優點:編、解碼操作簡單,遺傳、交叉便于實作

缺點:長度大

(2)其他編碼方法

格雷碼、浮點數編碼、符号編碼、多參數編碼等

3.2.2 适應度函數

适應度函數要有效反映每一個染色體與問題的最優解染色體之間的差距。

3.2.3選擇算子

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

3.2.4 交叉算子

交叉運算是指對兩個互相配對的染色體按某種方式互相交換其部分基因,進而形成兩個新的個體;交叉運算是遺傳算法差別于其他進化算法的重要特征,是産生新個體的主要方法。在交叉之前需要将群體中的個體進行配對,一般采取随機配對原則。

常用的交叉方式:

單點交叉

雙點交叉(多點交叉,交叉點數越多,個體的結構被破壞的可能性越大,一般不采用多點交叉的方式)

均勻交叉

算術交叉

3.2.5 變異算子

遺傳算法中的變異運算是指将個體染色體編碼串中的某些基因座上的基因值用該基因座的其他等位基因來替換,進而形成一個新的個體。

就遺傳算法運算過程中産生新個體的能力方面來說,交叉運算是産生新個體的主要方法,它決定了遺傳算法的全局搜尋能力;而變異運算隻是産生新個體的輔助方法,但也是必不可少的一個運算步驟,它決定了遺傳算法的局部搜尋能力。交叉算子與變異算子的共同配合完成了其對搜尋空間的全局搜尋和局部搜尋,進而使遺傳算法能以良好的搜尋性能完成最優化問題的尋優過程。

3.2.6 運作參數

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

4 遺傳算法的基本原理

4.1 模式定理

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

4.2 積木塊假設

具有低階、定義長度短,且适應度值高于群體平均适應度值的模式稱為基因塊或積木塊。

積木塊假設:個體的基因塊通過選擇、交叉、變異等遺傳算子的作用,能夠互相拼接在一起,形成适應度更高的個體編碼串。

積木塊假設說明了用遺傳算法求解各類問題的基本思想,即通過積木塊直接互相拼接在一起能夠産生更好的解。

二、源代碼

clear all
clc
close all
tic
%% 全局變量
global pn
global tn
global R
global S2
global S1
global S
S1 = 12;
%% 資料處理
%% 資料處理
data1 =xlsread('資料.xls');%導入資料
%% 訓練資料
input = data1(1:9,2:7);%訓練輸入
output = data1(1:9,8);%訓練輸出
input_test = data1(10:end,2:7);%測試輸入
output_test= data1(10:end,end);%測試輸出
output_test =    output_test';
M =size(input,2); %輸入節點個數
N =size(output,2);%輸出節點個數
%% 訓練資料
p = input';
t = output';
[pn,minp,maxp,tn,mint,maxt] =premnmx(p,t);%歸一化
%% 建立神經網絡
net = newff(minmax(pn),[S1,1],{'tansig','purelin'});
net.trainParam.show = 50;
net.trainParam.lr = 0.1;
net.trainParam.epochs = 1000;
net.trainParam.goal =1e-10;
[net,tr] = train(net,pn,tn);
%% 遺傳操作
R = size(p,1);
S2= size(t,1);
S = R*S1+S1*S2+S1+S2;
aa = ones(S,1)*[-1 1];
popu = 50;
initPpp = initializega(popu,aa,'gabpEval');
gen = 500;
[x,endPop,bPop,trace] = ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
    'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%% 畫圖疊代圖
figure(1)
plot(trace(:,1),1./trace(:,3),'r-');
hold on
grid on
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('疊代數')
ylabel('均方誤差')
title('均方誤差曲線圖')
figure(2)
plot(trace(:,1),trace(:,3),'r-');
hold on
grid on
plot(trace(:,1),trace(:,2),'b-');
xlabel('疊代數')
ylabel('适應度函數值')
title('适應度函數疊代曲線圖')
[W1,B1,W2,B2,val] = gadecod(x);
W1;
W2;
B1;
B2;
net.IW{1,1} = W1;
net.LW{2,1} = W2;
net.b{1} = B1;
net.b{2} = B2;
net = train(net,pn,tn);
k = input_test';
kn = tramnmx(k,minp,maxp);
s_bp = sim(net,kn);
s_bp2 = postmnmx(s_bp,mint,maxt)
toc
warning off %清除警告
%% 資料處理
data1 =xlsread('資料.xls');%導入資料
%% 訓練資料
data_p = data1(1:9,2:7);%訓練輸入
data_t = data1(1:9,8);%訓練輸出
data_k = data1(10:end,2:7);%測試輸入
outtest = data1(10:end,end);%測試輸出
[m1,n1] = size(data_p);%訓練資料的大小
[m2,n2] = size(data_t);%測試資料的大小
p = data_p';%轉置 适應BP工具箱
t = data_t';%轉置 适應BP工具箱
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);%歸一化
k = data_k';%測試輸入裝置
kn = tramnmx(k,minp,maxp);%測試輸入歸一化
%% BP模型
%建立網絡及參數設定
S1 =10;%隐含層
net = newff(minmax(pn),[S1,1],{'tansig','purelin'});%建立網絡
inputWeights = net.IW{1,1};%輸入層到隐含層權值
inputbias = net.b{1};%輸入層到隐含層閥值
layerWeights = net.IW{2,1};%隐含層到輸出權值
layerbias = net.b{2};%隐含層到輸出閥值
net.trainParam.show = 50;%疊代顯示步數間隔 對結果無影響 
net.trainParam.lr = 0.1;%學習率
net.trainParam.mc = 0.9;%動量因子
net.trainParam.epochs = 10000;%最大疊代次數
net.trainParam.goal =0.00001;%訓練目标
%% 訓練模型
[net,tr] = train(net,pn,tn);%訓練網絡
nihe = sim(net,pn);%訓練輸出
nihe2 = postmnmx(nihe,mint,maxt);%訓練輸出反歸一化
figure%畫圖
xk = 2;%線寬
plot(2006:2014,nihe2,'r-o',2006:2014,data_t,'b.-','linewidth',xk)%訓練輸出與拟合值的對比圖
grid on%網格
legend('真實值','預測值')%圖例
title('神經網預測真實值與預測值對比')%标題
xlabel('年份')%橫坐标标題
ylabel('商品房平均房價')%縱坐标标題
%% 預測
s_bp = sim(net,kn);%預測
s_bp2 = postmnmx(s_bp,mint,maxt);%預測輸出反歸一化
s_bp2 = s_bp2';%轉置
figure%畫圖
plot(2015:2017,outtest,'r-',2015:2017,s_bp2,'b.-','linewidth',xk)%測試輸出與真實值的對比圖
grid on%加網格
legend('真實值','預測值')%圖例
title('神經網預測真實值與預測值對比')%标題
xlabel('年份')%橫坐标标題
ylabel('商品房平均房價')%縱坐标标題
%% 誤差分析
           

三、運作結果

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼
【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼
【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

【預測模型】基于遺傳算法優化BP神經網絡房價預測matlab源碼

繼續閱讀