MATLAB神經網路(四):基於Adaboost的強分類器設計
Adaboost演算法的思想是合併多個「弱」分類器的輸出以產生有效分類。其主要步驟為:首先給出弱學習演算法和樣本空間(x,y),從樣本空間中找出m組訓練數據,每組訓練數據的權重都是1/m。然後用弱學習演算法迭代運算T次,每次運算後都按照分裂結果更新訓練數據權重分布,對於分類失敗的訓練個體賦予較大權重,下一次迭代運算時更加關注這些訓練個體。弱分類通過反覆迭代得到一個分類函數序列f1,f2,f3.....fT,每個分類函數賦予一個權重,分裂結果越好的函數,其對應權重越大。T次迭代之後,最終強分類函數F由弱分類函數加權得到。
本例為公司財務預警系統,通過公司的各項指標綜合評價並預測公司財務狀況、發展趨勢和變化,為決策者科學決策提供智力支持。指標可分為表內信息指標、盈利能力指標、償還能力指標、成長能力指標、現金流量指標和表外信息指標六大指標,每項大指標又分為若干小指標,如盈利能力指標又可分為凈資產收益率、總資產報酬率、每股收益、主營業務利潤率和成本費用利潤率等。在用於公司財務預警如果對所有指標都進行評價後綜合,模型過於複雜,並且各指標間相關性較強,,因此在模型建立前需要篩選指標。
指標篩選分為顯著性分析和因子分析兩步。顯著性分析通過T檢驗分析ST公司和非ST公司,在財務指標中找出差別較大、能夠明顯區分兩類公司的財務指標。因子分析在顯著性分析基礎上對篩選出來的指標計算主成分特徵值,從中找出特徵值大的指標為公司預警方法的最終評價指標。
load data input_train output_train input_test output_testnn%測試樣本權重n[mm,nn]=size(input_train);nD(1,:)=ones(1:nn)/nn;n
弱分類器學習分類:把BP神經網路看作弱分類器,經過訓練後分類訓練樣本,並且根據訓練樣本分類結果調整訓練樣本權重值,最終得出一系列弱分類器權重。
K=10; %弱分類器數量nfor i=1:Kn %訓練樣本歸一化n [inputn,inputps=mapminmax(input_train);n [outputn,outputps]=mapminmax(output_train);n error(i)=0;n n %BP神經網路構建n net=newff(inputn,outputn,6);n net.trainParam.epochs=4;n net.trainParam.lr=0.1;n net.trainParam.goal=0.0004;n n %BP神經網路訓練n net=train(net,inputn,outputn);n n %訓練數據預測n an1=sim(net.inputn);n test_simul(i,:)=mapminmax(reverse,an1,outputps)n %測試數據預測n input_test=mapminmax(apply,input_test,inputps);n an2=sim(net,inputn_test);n test_simu(i,:)=mapminmax(reverse,an,outputps);n %統計輸出結果n kk1=find(test_simu(i,:)>0);n kk2=find(test_simu(i,:)<0);n aa(kk1)=1;n aa(kk2)=-1;n n %統計錯誤樣本數n for j=1:nnn if aa(j)~-output_train(j);n error(i)=error(i)+D(i,j);n endn endn %弱分類器i權重n at(i)=0.5*log((1-error(i))/error(i));n %更新D值n for j=1:nnn D(i+1,j)=D(i,j)*exp(-at(i)*aa(j)*test_simu(i,j));n endn n %D值歸一化n Dsum=sum(D(i+1,:));n D(i+1,:)=D(i+1,:)/Dsum;n endn
強分類器分類和結果統計
由10組弱分類器BP網路組成強分類器對分析樣本進行分類,並統計分類誤差。
%強分類器分類結果noutput=sign(at*test_simu);n%統計強分類器每類分類錯誤個數nkkk1=0;nkkk2=0;nfor j=1:350n if output(j)==1n if output(j)~=output_test(j)n kkk1=kkk1+1;n endn endnn if output(j)==-1n if output(j)~=output_test(j)n kkk2=kkk2+1;n endn endnendnn%統計弱分類器每類分類誤差個數nfor i=1:Kn error1(i)=0;n kk1=find(test_simu(i,:)>0);n kk2=find(test_simu(i,:)<0);n n aa(kk1)=1;n aa(kk2)=-1;nn for j=1:350n if aa(j)~=output_test(j);n error1(i)=error1(i)+1;n endn endnendn
Adaboost方法不僅可以用於設計強分類器,還可以用於設計強預測器。強預測器設計思路與強分類器類似,都是先賦予測試樣本權重,然後根據弱預測器預測結果調整測試樣本權重並確定弱預測器權重,最後把弱預測器序列作為強預測器。不同的是在強分類器中增加預測錯類別樣本的群眾,在強預測器增加預測誤差超過閾值的樣本黔中,採用BP_Adaboost強預測器預測第2章中非線性函數輸出,函數形式為
步驟分為:
數據集選擇:從樣本空間中選擇訓練樣本,測試樣本,並對測試樣本分配權重。%下載數據nload data1 input outputn%從中隨機選擇1900組訓練數據和100組測試數據nk=rand(1:2000);n[x,n]=sort(k);n%訓練樣本ninput_train=input(n(1:1900),:);noutput_train=output(n(1:1900),:);n%測試樣本ninput_test=input(n(1901:2000),:);noutput_test=output(n(1901:2000),:);n%歸一化n[inputn,inputps]=mapminmax(input_train);n[outputn,outputps]=mapminmax(output_train);n%樣本權重n[mm,nn]=size(input_train);nD(1,:)=ones(1,nn)/nn; n
弱預測器學習預測
K=10;n%循環開始nfor i=1:Kn %弱預測器訓練n net=newff(inputn.outputn,5);n net.trainParam.epochs=20;n net.trainParam.lr=0.1;n net.train(net,inputn,outputn);nn %弱預測器預測n an1=sim(net,inputn);n BPoutput=mapminmax(reverse,an1,outputps);n %預測誤差n erroryc(i,:)=output_train-BPoutputn %測試數據預測n inputn1=mapminmax(apply,input_test,inputps)n an2=sim(net,inputn1);n test_simu(i,:)=mapminmax(reverse,an2,outputps);n n %調整D值n Error(i)=0;n for j=1:nnn if abs(erroryc(i,j))>0.1 %誤差超過閾值n Error(i)=Error(i)+D(i,j);n D(i+1,j)=D(i,j)*1.1;n elsen D(i+1,j)=D(i,j);n endn endnn %D值歸一化n at(i)=0.5/exp(abs(Error(i))); %log(1-Error(i))/Error(i));n D(i+1,:)=D(i+1,:)/sum(D(i+1,:));n endn
強預測器預測
把10組弱預測器函數組成強預測器預測輸出,並比較強預測器預測誤差和弱預測器預測誤差
%弱預測器權重歸一化nat=at/sum(at);nn%強預測器預測結果noutput=at*test_simu;n%強預測器預測誤差nerror=output_test-output;nn%弱預測器預測誤差nfor i=1:10n error1(i,:)=test_simu(i,:)-output;nendnn%誤差比較nplot(abs(error),-*)nhold onnplot(abs(error1)),-or)ntitle(強預測器預測誤差絕對值,fontsize,12)nxlabel(預測樣本,fontize,12)nylabel(誤差絕對值,fontsize,12)nlegend(強預測器預測,弱預測器預測)n
推薦閱讀:
※MATLAB和物聯網連載6: Thingspeak Tutorial 5
※淺談線性化
※Matlab如何製作屬於自己的縮寫詞典
※機器學習筆記25 —— 編程作業8異常檢測演算法和推薦系統