APP下载

一种回声状态神经网络分类挖掘教学演示模型

2016-02-19王华秋

计算机时代 2016年2期

王华秋

DOI:10.16644/j.cnki.cn33-1094/tp.2016.02.024

摘  要: 回声状态神经网络分类算法是一种重要的数据挖掘方法,是处理大数据分类的重要工具。但该算法原理比较抽象,从公式推导的角度很难让学生深刻理解,因此提出利用MATLAB数学软件实现回声状态神经网络分类算法,将其编译成.NET平台的COM组件,由Visual C#.NET集成开发环境下的应用程序调用编译后的MATLAB的COM组件,实现回声状态神经网络的分类模型。

关键词: 回声状态神经网络; 分类模型; 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 引言

回声状态神经网络(ESN)由Jaeger于2001年提出[1],其特点在于将随机稀疏连接的神经元构成的储备池作为隐藏层,用以对输入进行高维的、非线性的表示。回声状态神经网络常用于解决数据分类决策问题,Alexandre等[2]提出面向静态模式分类的回声状态网络方法。彭喜元等[3]在此基础上提出了随机子空间多储备池分类模型,提高了传统回声状态网络分类模型的泛化能力及分类性能,郭嘉等[4]在Alexandre基础上提出了基于相应簇的回声状态网络静态分类方法,将储备池子簇与需分类数据类别数量建立对应关系,能够更好地满足对不同数据有针对性的分类需求。

神经网络分类算法是数据挖掘的一种重要方法,是教学中的重点环节,由于回声状态神经网络分类算法比较复杂,单从公式推导的角度讲解,学生会难以真正理解,因此需要编程实现这些算法,让学生有一个直观的认识,这种分类算法需用到多种数学公式,用高级语言编程代码量较大,学生依然难于理解,为了用少量的代码编写复杂的分类算法程序,本文采用专业数学软件MATLAB实现了回声状态神经网络分类算法。但由于MATLAB软件主要是处理数学公式,进行复杂的矩阵运算,因此专业性较强,对于非数学专业用户来说输入矩阵复杂、输出结果抽象,较难理解[5],而且MATLAB是纯粹的数学计算工具,操作界面繁琐,造成用户使用不方便[6]。本文采用混合编程技术,即使用.NET编程环境,通过COM组件跨平台调用的方式集成MATLAB自定义DLL组件,构建既能够进行专业的数学分析和数学计算,又具有友好的操作界面,方便非专业人员使用的分类模型。

1 总体思路

首先,在MATLAB R2010b中新建.NET Aseembly类型的工程,编写实现分类算法的m文件,编译生成相应的COM组件。在Visual Studio 2010应用程序中引用MATLAB R2010b组件MWArray和实现分类算法的自定义组件,结合页面输入将数据参数传递给自定义组件,就可进行分析计算,并将结果返回到界面中。系统的技术架构如图1所示。

2 回声状态网络分类模型

ESN是一种新型的递归神经网络,由输入层、储备池、输出层组成,其结构如图2所示。

假设该网络中输入层有K个输入,储备池有N个内部连接单元,输出层有L个输出,储备池内部单元状态更新方程如公式⑴所示:

x(n+1)=f(Winu(n+1)+Wx(n))  ⑴

其中,x(n)=(x1(n),…,xN(n))T表示回声状态网络的状态变量,y(n)=(y1(n),…,yL(n))T表示目标输出,u(n)=(u1(n),…,uK(n))T表示输入。f表示储备池处理单元处理函数,本文选择双曲正切函数tanh。Win表示输入单元与储备池处理单元的连接权值,W为储备池内处理单元之间的连接权值,其中Win、W无须训练,经初试给定后不再发生改变。

回声状态网络分类模型在训练某特征数据对应的状态变量x(n)时保持输入数据不变,当状态变量的变化量‖x(n)-x(n-1)‖小于阈值δ时,表示状态变量趋于稳定,该特征数据对应的状态变量训练完成。

关键代码如下:

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表示储备池与输出单元的连接权值为输出层到储备池的连接权值,通过状态变量计算得到,f为输出单元处理函数。

关键语句如下:

x1=tanh(Win1*[1;u]+W1*x1);

y=Wout1*x1;

3 生成COM组件

在MATLAB R2010b中编译生成.NET使用的COM组件的步骤如下:

⑴ 新建Deployment Project,名称为DM.prj,选择Type为.NET Assembly。

⑵ 新建m文件,将实现回声状态神经网络分类算法的语句写入其中。

⑶ 在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 分类模型的实现

在VS2010中调用MATLAB R2010b中的dll文件实现分类模型步骤如下。

⑴ 在VS2010中新建项目,使用C#语言建立Windows应用程序。

⑵ 在VS2010中设计友好的交互界面。

⑶ 在设计界面中,添加原始数据表格DataGridView,根据原始数据量的大小确定储备池有N个内部连接单元个数,这是惟一需要设置的参数。在表格右边加入三个TextBox控件,分别存放目标分类结果,实际分类结果和分类正确标志。在Button控件的Clicked 事件中,加入代码,实现IRIS数据库的回声状态网络分类。这样即可方便用户参看原始数据,又可观察分类效果,实现了良好的界面展示。

⑷ 添加引用组件:在.NET编程环境中,MATLAB程序输入、处理、输出的数字数据只能是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。

⑹ 根据界面输入,提取相应的判断矩阵,数据格式的转换是需要解决的主要问题。

关键语句如下:

//定义二维数组,用于存储输入、输出数据。

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;

//强制类型转换,以便作为参数传递给MATLAB生成的COM组件

arrI_1=(MWNumericArray)(I_1);

MWNumericArray arrI_OUT=null;

arrI_OUT=(MWNumericArray)(I_OUT);

⑺ 调用DM组件实现分类决策。添加“IRIS数据分类”按钮,在click事件中写入代码,调用MATLAB生成的组件,实现分类决策。这里以IRIS鸢尾花数据作为分类算法的数据来源,数据集包含150个数据集,分为三类,每类50个数据,每个数据包含4个属性,三类分别为:setosa,versicolor,virginica,数据包含4个独立的属性,这些属性变量测量植物的花朵,比如萼片和花瓣的长度等。

关键代码如下:

ESN e1=new ESN(); //初始化一个对象

MWArray[] argsOut1=null; //用于存储多个输出结果

int numArgsOut1=3;

int N=40;

argsOut1=e1.ESNClassificationTrain(numArgsOut1,arrI_

1,arrI_OUT,N); //调用MATLAB中写好的函数ESNClassificationTrain,此函数的功能是根据数据训练分类模型,得到3组输出参数,即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中写好的函数ESNClassificationTest,此函数的功能是根据判断数据的分类结果,得到3组输出参数,即目标分类结果,实际分类结果和分类错误标识。

//输出的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";

}

最终实现的分类模型运行结果如图3所示。

5 总结

回声状态神经网络分类比较复杂,传统的公式推导令人难以理解,用高级语言编程又难以用简洁代码实现,为了用简易的计算机代码反映复杂的数学公式,本文利用MATLAB与.NET混合编程实现基于回声状态神经网络分类挖掘实验演示系统,体现了MATLAB专业数学软件功能强大、计算简单的优势,通过.NET平台调用编译后的MATLAB的COM组件,通过界面的直观设计,简化用户操作,提高了程序的可操作性。本文使用的实例是回声状态神经网络分类模型,今后在实际应用中可自行构建具体目标的指标体系实现分类决策。

参考文献(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] 郭嘉,雷苗,彭喜元.基于相应簇回声状态网络静态分类方法[J].

电子学报,2011.39(3):14-18

[5] 蒋顺业,兰洋.C#与Matlab混合编程在预警系统中的应用[J].

软件,2013.34(4):83-84

[6] 田鹏,姜印平.MATLAB与C#混合编程在ASP.NET数值计

算中的分析与实现[J].天津理工大学学报,2014.30(4):41-45