王華秋



DOI:10.16644/j.cnki.cn33-1094/tp.2016.02.024
摘 ?要: 回聲狀態(tài)神經(jīng)網(wǎng)絡分類算法是一種重要的數(shù)據(jù)挖掘方法,是處理大數(shù)據(jù)分類的重要工具。但該算法原理比較抽象,從公式推導的角度很難讓學生深刻理解,因此提出利用MATLAB數(shù)學軟件實現(xiàn)回聲狀態(tài)神經(jīng)網(wǎng)絡分類算法,將其編譯成.NET平臺的COM組件,由Visual C#.NET集成開發(fā)環(huán)境下的應用程序調用編譯后的MATLAB的COM組件,實現(xiàn)回聲狀態(tài)神經(jīng)網(wǎng)絡的分類模型。
關鍵詞: 回聲狀態(tài)神經(jīng)網(wǎng)絡; 分類模型; MATLAB組件; Windows應用程序
中圖分類號:G642 ? ? ? ? ?文獻標志碼:A ? ? 文章編號:1006-8228(2016)02-82-04
A teaching demonstration model of classification mining
based on echo state neural network
Wang Huaqiu
(Computer Science and Engineering College, Chongqing University of Technology, Chongqing 400054, China)
Abstract: Echo state neural network classification algorithm is an important data mining method, which is an important tool to deal with classification of Big data. But the principle of the algorithm is abstract and complex, and it is very difficult for the students to understand the essence of the algorithm from the angle of formula derivation. In this paper, echo state neural network classification algorithm is realized by MATLAB mathematics software, and is compiled into COM component on .NET platform. The compiled COM component is called by an application program, which is developed in Visual C#.NET integrated environment, to realize the echo state neural network classification model.
Key words: echo state neural network; classification model; MATLAB component; Windows application program
0 引言
回聲狀態(tài)神經(jīng)網(wǎng)絡(ESN)由Jaeger于2001年提出[1],其特點在于將隨機稀疏連接的神經(jīng)元構成的儲備池作為隱藏層,用以對輸入進行高維的、非線性的表示。回聲狀態(tài)神經(jīng)網(wǎng)絡常用于解決數(shù)據(jù)分類決策問題,Alexandre等[2]提出面向靜態(tài)模式分類的回聲狀態(tài)網(wǎng)絡方法。彭喜元等[3]在此基礎上提出了隨機子空間多儲備池分類模型,提高了傳統(tǒng)回聲狀態(tài)網(wǎng)絡分類模型的泛化能力及分類性能,郭嘉等[4]在Alexandre基礎上提出了基于相應簇的回聲狀態(tài)網(wǎng)絡靜態(tài)分類方法,將儲備池子簇與需分類數(shù)據(jù)類別數(shù)量建立對應關系,能夠更好地滿足對不同數(shù)據(jù)有針對性的分類需求。
神經(jīng)網(wǎng)絡分類算法是數(shù)據(jù)挖掘的一種重要方法,是教學中的重點環(huán)節(jié),由于回聲狀態(tài)神經(jīng)網(wǎng)絡分類算法比較復雜,單從公式推導的角度講解,學生會難以真正理解,因此需要編程實現(xiàn)這些算法,讓學生有一個直觀的認識,這種分類算法需用到多種數(shù)學公式,用高級語言編程代碼量較大,學生依然難于理解,為了用少量的代碼編寫復雜的分類算法程序,本文采用專業(yè)數(shù)學軟件MATLAB實現(xiàn)了回聲狀態(tài)神經(jīng)網(wǎng)絡分類算法。但由于MATLAB軟件主要是處理數(shù)學公式,進行復雜的矩陣運算,因此專業(yè)性較強,對于非數(shù)學專業(yè)用戶來說輸入矩陣復雜、輸出結果抽象,較難理解[5],而且MATLAB是純粹的數(shù)學計算工具,操作界面繁瑣,造成用戶使用不方便[6]。本文采用混合編程技術,即使用.NET編程環(huán)境,通過COM組件跨平臺調用的方式集成MATLAB自定義DLL組件,構建既能夠進行專業(yè)的數(shù)學分析和數(shù)學計算,又具有友好的操作界面,方便非專業(yè)人員使用的分類模型。
1 總體思路
首先,在MATLAB R2010b中新建.NET Aseembly類型的工程,編寫實現(xiàn)分類算法的m文件,編譯生成相應的COM組件。在Visual Studio 2010應用程序中引用MATLAB R2010b組件MWArray和實現(xiàn)分類算法的自定義組件,結合頁面輸入將數(shù)據(jù)參數(shù)傳遞給自定義組件,就可進行分析計算,并將結果返回到界面中。系統(tǒng)的技術架構如圖1所示。
2 回聲狀態(tài)網(wǎng)絡分類模型
ESN是一種新型的遞歸神經(jīng)網(wǎng)絡,由輸入層、儲備池、輸出層組成,其結構如圖2所示。
假設該網(wǎng)絡中輸入層有K個輸入,儲備池有N個內(nèi)部連接單元,輸出層有L個輸出,儲備池內(nèi)部單元狀態(tài)更新方程如公式⑴所示:
x(n+1)=f(Winu(n+1)+Wx(n)) ?⑴
其中,x(n)=(x1(n),…,xN(n))T表示回聲狀態(tài)網(wǎng)絡的狀態(tài)變量,y(n)=(y1(n),…,yL(n))T表示目標輸出,u(n)=(u1(n),…,uK(n))T表示輸入。f表示儲備池處理單元處理函數(shù),本文選擇雙曲正切函數(shù)tanh。Win表示輸入單元與儲備池處理單元的連接權值,W為儲備池內(nèi)處理單元之間的連接權值,其中Win、W無須訓練,經(jīng)初試給定后不再發(fā)生改變。
回聲狀態(tài)網(wǎng)絡分類模型在訓練某特征數(shù)據(jù)對應的狀態(tài)變量x(n)時保持輸入數(shù)據(jù)不變,當狀態(tài)變量的變化量‖x(n)-x(n-1)‖小于閾值δ時,表示狀態(tài)變量趨于穩(wěn)定,該特征數(shù)據(jù)對應的狀態(tài)變量訓練完成。
關鍵代碼如下:
X1=zeros(N,n);
Yt=I_OUT;
for t=1:n
u=I_1(:,t);
x1=zeros(N,1);
x11=zeros(N,1)+1;
his=200;
error=0;
while(sum(abs(x1-x11))>1&&error<2)
if(sum(abs(x1-x11))-his>0)
error=error+1;
his=sum(abs(x1-x11));
x11=x1;
x1=tanh(Win1*[1;u] + W1*x1);
else
error=0;
his=sum(abs(x1-x11));
x11=x1;
x1=tanh(Win1*[1;u] + W1*x1);
end
end
X1(:,t)=x1;
end
分類輸出如公式⑵所示:
y(n+1)=Woutf(u(n+1),x(n+1)) ?⑵
其中,Wout表示儲備池與輸出單元的連接權值為輸出層到儲備池的連接權值,通過狀態(tài)變量計算得到,f為輸出單元處理函數(shù)。
關鍵語句如下:
x1=tanh(Win1*[1;u]+W1*x1);
y=Wout1*x1;
3 生成COM組件
在MATLAB R2010b中編譯生成.NET使用的COM組件的步驟如下:
⑴ 新建Deployment Project,名稱為DM.prj,選擇Type為.NET Assembly。
⑵ 新建m文件,將實現(xiàn)回聲狀態(tài)神經(jīng)網(wǎng)絡分類算法的語句寫入其中。
⑶ 在MATLAB R2010b窗口右側的.NET Assembly對話框中,依次選擇Add class和Add files添加ESNClassificationTrain.m和ESNClassificationTest.m文件。通過build 按鈕即可進行編譯。編譯完成后會在安裝目錄C:\Program Files\MATLAB\R2010b\
bin\DM\distrib下生成DM.dll和DMNative.dll文件。
4 分類模型的實現(xiàn)
在VS2010中調用MATLAB R2010b中的dll文件實現(xiàn)分類模型步驟如下。
⑴ 在VS2010中新建項目,使用C#語言建立Windows應用程序。
⑵ 在VS2010中設計友好的交互界面。
⑶ 在設計界面中,添加原始數(shù)據(jù)表格DataGridView,根據(jù)原始數(shù)據(jù)量的大小確定儲備池有N個內(nèi)部連接單元個數(shù),這是惟一需要設置的參數(shù)。在表格右邊加入三個TextBox控件,分別存放目標分類結果,實際分類結果和分類正確標志。在Button控件的Clicked 事件中,加入代碼,實現(xiàn)IRIS數(shù)據(jù)庫的回聲狀態(tài)網(wǎng)絡分類。這樣即可方便用戶參看原始數(shù)據(jù),又可觀察分類效果,實現(xiàn)了良好的界面展示。
⑷ 添加引用組件:在.NET編程環(huán)境中,MATLAB程序輸入、處理、輸出的數(shù)字數(shù)據(jù)只能是MWNumericArray類型的矩陣。所以需引用MWarray.dll組件,該組件的位置在MATLAB的安裝目錄\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win32\
v2.0下。另外,還需添加上述的自定義組件DM.dll和DMNative.dll。
在代碼中加入以下語句,即可在程序中調用相應組件。
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using DM;
⑸ 由于MWarray.dll是64位的組件,而Windows應用程序編譯生成的程序是32位的。因此要需要在工程屬性中將應用程序生成的目標平臺設置為x64。
⑹ 根據(jù)界面輸入,提取相應的判斷矩陣,數(shù)據(jù)格式的轉換是需要解決的主要問題。
關鍵語句如下:
//定義二維數(shù)組,用于存儲輸入、輸出數(shù)據(jù)。
double[,] I_1=new double[dt.Columns.Count-1, dt.Rows.Count];
double[,] I_OUT=new double[ay.Count -1, dt.Rows.Count];
//定義MATLAB類型的矩陣變量
MWNumericArray arrI_1=null;
//強制類型轉換,以便作為參數(shù)傳遞給MATLAB生成的COM組件
arrI_1=(MWNumericArray)(I_1);
MWNumericArray arrI_OUT=null;
arrI_OUT=(MWNumericArray)(I_OUT);
⑺ 調用DM組件實現(xiàn)分類決策。添加“IRIS數(shù)據(jù)分類”按鈕,在click事件中寫入代碼,調用MATLAB生成的組件,實現(xiàn)分類決策。這里以IRIS鳶尾花數(shù)據(jù)作為分類算法的數(shù)據(jù)來源,數(shù)據(jù)集包含150個數(shù)據(jù)集,分為三類,每類50個數(shù)據(jù),每個數(shù)據(jù)包含4個屬性,三類分別為:setosa,versicolor,virginica,數(shù)據(jù)包含4個獨立的屬性,這些屬性變量測量植物的花朵,比如萼片和花瓣的長度等。
關鍵代碼如下:
ESN e1=new ESN(); //初始化一個對象
MWArray[] argsOut1=null; //用于存儲多個輸出結果
int numArgsOut1=3;
int N=40;
argsOut1=e1.ESNClassificationTrain(numArgsOut1,arrI_
1,arrI_OUT,N); //調用MATLAB中寫好的函數(shù)ESNClassificationTrain,此函數(shù)的功能是根據(jù)數(shù)據(jù)訓練分類模型,得到3組輸出參數(shù),即Win,W和Wout。
MWArray[] argsOut2=null; //用于存儲多個輸出結果
int numArgsOut2=3;
argsOut2=e1.ESNClassificationTest(numArgsOut2,
(MWArray)argsOut1.GetValue(0), (MWArray)argsOut1
.GetValue(1), (MWArray)argsOut1.GetValue(2),arrI_1,
arrI_OUT,N); //調用MATLAB中寫好的函數(shù)ESNClassificationTest,此函數(shù)的功能是根據(jù)判斷數(shù)據(jù)的分類結果,得到3組輸出參數(shù),即目標分類結果,實際分類結果和分類錯誤標識。
//輸出的MWArray[]類型轉換為double[,]
double[,] targetOut=new double[1,argsOut2[0]
.NumberOfElements];
targetOut=(double[,])argsOut2[0].ToArray();
double[,] realOut=new double[1,argsOut2[1]
.NumberOfElements];
realOut=(double[,])argsOut2[1].ToArray();
double[,] correctID=new double[1,argsOut2[2]
.NumberOfElements];
correctID=(double[,])argsOut2[2].ToArray();
//將目標值,實際值和錯誤標識顯示在控件中
for (int i=0; i<targetOut.Length; i++)
{
textBox1.Text+=targetOut[0,i].ToString()+"\r\n";
textBox5.Text+=realOut[0,i].ToString()+"\r\n";
if(correctID[0,i]!=0)
textBox6.Text+=i.ToString()+"出錯"+"\r\n";
else
textBox6.Text+=""+"\r\n";
}
最終實現(xiàn)的分類模型運行結果如圖3所示。
5 總結
回聲狀態(tài)神經(jīng)網(wǎng)絡分類比較復雜,傳統(tǒng)的公式推導令人難以理解,用高級語言編程又難以用簡潔代碼實現(xiàn),為了用簡易的計算機代碼反映復雜的數(shù)學公式,本文利用MATLAB與.NET混合編程實現(xiàn)基于回聲狀態(tài)神經(jīng)網(wǎng)絡分類挖掘實驗演示系統(tǒng),體現(xiàn)了MATLAB專業(yè)數(shù)學軟件功能強大、計算簡單的優(yōu)勢,通過.NET平臺調用編譯后的MATLAB的COM組件,通過界面的直觀設計,簡化用戶操作,提高了程序的可操作性。本文使用的實例是回聲狀態(tài)神經(jīng)網(wǎng)絡分類模型,今后在實際應用中可自行構建具體目標的指標體系實現(xiàn)分類決策。
參考文獻(References):
[1] Jaeger H. The “Echo State” Approach to Analysing and
Training Recurrent Neural Networks[R]. German National Reasearch Center for Information Technology,2001.
[2] Alexandre L A, Embrechts M J, Linton J. ?Benchmarking
Reservoir Computing on Time-independent Classification Tasks[C].In: Proceedings of the 2009 International Joint Conference on Neural Networks, Atlanta GA, USA,2009:89-93
[3] 彭喜元,郭嘉,王建民.基于隨機子空間與多儲備池的分類方
法[J].儀器儀表學報,2011.32(11):2487-2492
[4] 郭嘉,雷苗,彭喜元.基于相應簇回聲狀態(tài)網(wǎng)絡靜態(tài)分類方法[J].
電子學報,2011.39(3):14-18
[5] 蔣順業(yè),蘭洋.C#與Matlab混合編程在預警系統(tǒng)中的應用[J].
軟件,2013.34(4):83-84
[6] 田鵬,姜印平.MATLAB與C#混合編程在ASP.NET數(shù)值計
算中的分析與實現(xiàn)[J].天津理工大學學報,2014.30(4):41-45