BP神经网络学习笔记

在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐含层节点个数是部确定的,
可以根据经验公式来确定:
这里写图片描述
h为隐含层节点的数目,m和n分别是输入层和输出层节点的数目,a为1~10之间的调节常数;
关于隐含层,一般认为,增加隐藏层数可以降低网络误差,提高精度,但也使网络复杂化,从而增加了网络训练时间和出现过拟合的倾向,一般情况,应该考虑3层BP网络(即1个隐含层),靠增加隐含层节点数来获取较低的误差(这种训练效果要比增加隐含层数更容易实现),隐含层节点数的选择很重要,他对建立神经网络模型的性能影响很大,但当前并没有一种科学的确定节点数的方法,如果数目太少,网络将不能建立复杂的判断界,训练不出合适的网络,不能识别以前没有看过的样本,容错性差,但数目过大,就会使训练时间过长,网络的泛化能力降低,而且误差也不一定最佳,因此存在一个最佳的隐藏层节点数.确定隐含层节点数的基本原则使:在满足精度的前提下,取尽可能紧凑的结构,即取尽可能少的隐含层节点数.综上.确定隐含层节点数应该满足以下条件:
隐含层节点数必须小于N-1(N是训练样本数),否则网络模型的系统误差与训练样本的特性无关而趋于0,即建立的网络模型没有泛化能力,也没有任何使用价值,同理,输入层的节点数也必须小于N-1;
训练样本数必须多余网络模型的连接权数,一般为2~10倍,否则,样本必须分成及部分且必须采用”轮流训练”的方法才能得到可靠的神经网络,通常可以采用上诉的经验公式

其中的阈值是指神经元接受到的刺激大于这个阈值的时候才会导致这个神经元影响下一个神经元的刺激,然后小于这个阈值的时候,该神经元的刺激不会刺激到下一个神经元,输入层是没有阈值的,输出层有阈值。

BP神经网络的主要目的就是反复修正权值和阈值,使得误差值达到最小:
这里写图片描述

1.textread('txt文件名包含单引号',‘数据格式比如%f包含单引号’,读取数据的次数可选参数);
它是每次读取一行,对应的赋值变量个数必须和矩阵列数一致;

2.转置矩阵正常写即可,A=B’

3.premnmx归一化函数已经过时,用法
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
是对P和T两个矩阵分别按照行进行归一化处理(映射到-1到1的区间),result=2*(m-min)/(max-min)-1
pn:p的归一化结果,minp: p的每行的最小值,maxp: p的每行的最大值
tn: t矩阵的归一化结果,mint: t矩阵的最小值,maxt: t矩阵的最大值
很多参数都是可选的,这里也可以仅对一个矩阵进行归一化处理;

Mapminmax()函数:
现在用mapminmax()函数替换它,一样的用法,只是每个仅能对一个矩阵进行归一化,主要的格式有
[Y,PS] = mapminmax(X)
表示将矩阵X进行归一化,Y为归一化的结果矩阵,PS则为归一化后矩阵的一些参数,比如X矩阵的最小值:PS.Xmin,结果矩阵的最大值:PS.Ymax;

[Y,PS] = mapminmax(X,FP)

Y = mapminmax('apply',X,PS)
,表示对已经对x1采用了某种规范化的方式,现在要对x2采用同样的规范化方式,比如:

 [y1,ps] = mapminmax(x1);
 y2 = mapminmax('apply',x2,ps)

X = mapminmax('reverse',Y,PS)作用是进行反归一化操作,得到原来的数据,比如:

[y1,ps] = mapminmax(x1);
xtt = mapminmax('reverse',y1,ps)

与之对应的是tramnmx()函数,格式如下[PN]=tramnmx(P,minp,maxp)
其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx或者mapminmax函数找到的最大值和最小值。

4.minmax(P)就是求矩阵P每行最小值和最大值组成的一个新矩阵

5.newff()函数是建立一个可训练的前馈网络对象net,
四个参数:
第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。
第二个参数是一个设定每层神经元个数的数组。
第三个参数是包含每层用到的传递函数名称的细胞数组。
最后一个参数是用到的训练函数的名称。
这里给出几个函数的表达式:
tansig(n) = 2/(1+exp(-2*n))-1,双曲正切函数,范围-1到1,
logsig(n) = 1 / (1 + exp(-n))
purelin(n)= n;(即y=x,输出等于激励函数)

traingdm是带动量的梯度下降法,trainlm是指L-M优化算法,trainscg是指量化共轭梯度法,
除此之外还有traingdxtraingda等,都是权值的训练算法。tansiglogsig 统称Sigmoid函数,logsig是单极性S函数,tansig是双极性S函数,也叫双曲正切函数,purelin是线性函数,是节点的传输函数。

比如net=newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
P为输入样本,通常取样本的最小、最大值组成的矩阵;T为目标样本也是输出样本;S是[Si,Si+1….Sn]隐含层的节点数i神经元个数
,输入层和输出层节点数有P和T的维度决定;TF是{TFi,TFi+1…TFn}是每层间的传输函数,
包含隐含层和输出层,隐含层默认使用tansig函数,输出层默认使用purelin函数;BTF表示
训练函数;BLF是学习函数,用于训练阶段权值和阈值的调整;PF为性能函数,用于衡量训练误差;IPF是输入层可以使用的数据处理函数,比如归一化函数mapminmax;OPF是输出层可以使用的数据处理函数;DDF函数用于训练阶段数据的划分。
除此以外还有以下的函数调用形式:
net = newff(P,T,S);
P是一个R x 2 的矩阵,每一行是相应输入的边界值,取最小、最大值。
T表示创建的网络有SN个输出层节点,每行是输出值的典型值
S是标量或向量,用于指定隐含层神经元个数,若隐含层多余一层,就写成行向量的形式

举例:旧版的newff函数的使用:

net1=newff(minmax(x),[10,1],{'tansig','purelin'},'trainlm');
net1=train(net1,x,y);
yy2=net1(xx);

其中minmax(x)表示取矩阵最小、最大值组成的N*2的矩阵
[10,1]表示隐含层包含10个神经元,输出层包含1个神经元
{'tansig','purelin'}表示每层使用的传输函数为双曲正切函数tansig和线性函数purelin
‘trainlm’表示使用trainlm函数来训练
旧版本newff默认训练函数为traingdx(学习率自适应并附加动量因子的最速下降法),新版默认使用训练函数为trainlm,速度相对提高,但更占用内存,新版中将输入的60%用于训练,20%用于校验,采用提前终止策略,防止过拟合的情况发生,但是往往新版newff函数训练的误差要大于旧版newff的误差

新版newff函数的用法:
net=newff(minmax(x),minmax(y),10);
net=train(net,x,y);
xx=-4:.2:4;
yy=net(xx);

其中minmax(x)表示输入层的典型值
minmax(y)表示输出层的典型值
10表示隐含层包含10个神经元

新版matlab中已经使用feedforwardnet函数来替代newff函数,方法:feedforwardnet(hiddenSize,trainFcn),这函数在训练时才指定输入层和输出的信息
其中hiddenSize表示隐含层的神经元节点数,若有多个隐含层,则表示成行向量,缺省值10,trainFcn表示训练函数,缺省值默认使用trainlm

下面开始创建一个神经网络,只有P和S是必须要设置的,其它不设置的话就是默认值。具体情况可以在帮助文件中查询。

P=[1 2 3 4 5]; %设置输入样本
T=[5 6 7 8 9]; %设置目标样本
net = newff(P,T,[155])

net对象需要设置一些参数:
.trainParam.goal=0.1 % 训练目标最小误差,这里设置为0.1
.trainParam.epochs=300; % 训练次数,这里设置为300次,训练的代数
.trainParam.show=20; % 现实频率,这里设置为没训练20次显示一次
.trainParam.mc=0.95; % 附加动量因子,缺省为0.9
.trainParam.lr=0.05; % 学习速率,这里设置为0.05,缺省为0.01
.trainParam.min_grad=1e-6; % 最小性能梯度
.trainParam.min_fail=5; % 最大确认失败次数

设置网络的训练参数
net.trainParam.epochs―最大收敛次数;
net.trainParam.goal―收敛误差;
net.trainParam.show―显示间隔;

以上在一般的神经网络训练中都有使用,本文使用Levenberg-Marquart优化算法进行训练,还需设置的参数有:
net.trainParam.mu―Levenberg-Marquart优化算法中的
net.trainParam.mu_dec― 的缩减因子;
net.trainParam.mu_inc― 的增大因子;
net.trainParam.mu_max― 的最大值;
net.trainParam.min_grad―性能函数的最小梯度;

在对新建的神经网络就行训练的时候,调用train()函数,传入创建的网络节点和进行归一化处理后的样本数据和样本的结果数据,返回的是节点和节点各个子节点的数据,比如:
[net,tr]=train(net,pn,tn);

6.[s1 , s2] = size(Y) 其中size函数是返回矩阵Y的行数s1和列数s2

7.zeros函数的用法
B=zeros(n):生成n×n全零阵。
B=zeros(m,n):生成m×n全零阵。

Ones函数和上诉类似

Cell()函数,是生成指定行列的空矩阵,每个矩阵的位置都可以存储任何数据类型(这里需要注意的是正常的矩阵元素是用中括号[]来括起来的,但是cell矩阵不是一样,他的每个元素都是用大括号{}括起来的),但是使用cell函数之前就必须先初始化。

8.size()函数:获取矩阵的行数和列数
S=size(A),当只有一个输出时,返回一个行向量,该行向量的第一个元素是矩阵的行数,第二个元素是矩阵的列数。
[r,c]=size(A),当有两个输出参数时,第一个参数表示矩阵的行数,第二个参数表示矩阵的列数
9.rand()函数
Y=rand(n)返回一个n*n的随机矩阵
Y=rand(n*m)或者rand([m n])返回一个随机m*n的随机矩阵
Y=rand(size(A))返回一个和A有相同尺寸的随机数组

10.mean()函数:用于求平均值
M=mean(A)
若A是向量,那返回的M是A中元素的平均值;
若A是矩阵,那将A中的各列看作是向量,返回的是包含每一列所有元素的平均值的行向量;
若A是一个多元数组,mean(A)将数组中第一个非单一维的值看成一个向量,返回每个向量的平均值。

11.std()函数:求方差,标准偏差,就是每个元素和平均值之差的平方和除以元素的个数即可
y=std(x)算出x的标准偏差。 x可以是vector或者一个matrix矩阵。
若x是vector,则y是算x的标准偏差。
若x是matrix,则y是个vector,存放的是算每一列/行的标准偏差。

std (x, flag,dim),默认是默认std格式是std(x,0,1);
fla表示标注公差时是要除以n还是n-1
flag==0………是除以n-1
flag==1………是除以n
dim表示维数
dim==1……….是按照列分
dim==2……….是按照行分 若是三维的矩阵,dim==3就按照第三维来分数据

12.mse()函数:求均方误差
公式为√[∑di^2/n]=Re,式中:n为测量次数;di为一组测量值与真值的偏差。
如果只有一组数据,那么样本方差就是均方误差,如果有多组数据(将N个数据分为r组),第i组数据的方差为S_i^2,则全体的均方误差为
MSE=(∑_(i=1)^r▒〖(n_i-1)S_i^2 〗)/(N-r)

  1. vec2ind()函数:向量变索引,
    比如:T(1,:)=[0 1 0 0 1 0];T(2,:)=[1 0 1 1 0 0];T(3,:)=[0 0 0 0 0 1],则矩阵T为
    0 1 0 0 1 0
    1 0 1 1 0 0
    0 0 0 0 0 1
    经过函数vec2ind()函数之后:vec2ind(T)就会得到一个1*6的向量,然后以T矩阵中的列向量为单位,查找每列中数字“1”的行号索引,第一列中1的行号为2,第二列中1的行号为1,第三列中1的行号为2,第四列中1的行号为2,第五列中行号中1的行号为1,第六列中1的行号为3,所以vec2ind(T)=[2 1 2 2 1 3]
    同样的还有其逆向函数ind2vec(),比如A=[1 3 2 2 2 1 2 1],则
    Ind2vec(A)=
    ■(1&0&■(0&0&■(0&0&■(1&1)))@0&0&■(1&1&■(1&0&■(1&0)))@0&1&■(0&0&■(0&0&■(0&0))))

均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)
MSE均方误差:
MSE=1/N ∑_(t=1)^N▒〖(〖observed-predicted)〗^2 〗
指参数估计值和参数真值之差平方的期望值,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述试验数据具有更好的精确度。

RMSE 均方误差根:它是均方根误差的算术平方根
RMSE=√(1/N ∑_(t=1)^N▒〖(observed-predicted)〗^2 )

MAE:据平均绝对误差是绝对误差的平均值,平均绝对误差能更好的反应预测值误差的实际情况,fi表示预测值,yi表示真实值
RMSE=1/N ∑_(i=1)^N▒|(f_i-y_i)|

SD标准差:是方差的算术平方根,标准差反映了数据集的离散程度,平均数相同的两组数组,标准差未必相同
SD=√(1/N ∑_(I=1)^N▒〖(x_i-u)〗^2 )

SSE和方差或者误差平方和:拟合数据和原始数据对应点的误差的平方和,SSE越接近0,说明模型选择和拟合更好,数据预测也越成功
SSE=1/n ∑_(i=1)^n▒〖w_i (y_i-y_i)〗^2

注:
1.网络训练好之后,net.iw{1,1}表示输入层到中间层(即第1层到第2层)的权值,net.b{1}则表示中间层(第2层)各个神经元的阈值,net.lw{2,1}则表示中间层到输出层(即第2层到第3层)的权值,net.b{2}表示输出层(第3层)各个神经元的阈值

2.BP神经网络的训练算法有如下的(即newff函数中最后的那个训练函数),
主要有如下的几个算法函数:
训练方法 训练函数
梯度下降法 Traingd
有动量的梯度下降法 Traingdm
自适应lr梯度下降法 Traingda
自适应lr动量梯度下降法 Traingdx
弹性梯度下降法 Trainrp
Fletcher-Reeves共轭梯度法 Traincgf
Ploak-Ribiere共轭梯度法 Traincgf
Powell-Beale共轭梯度法 Traincgb
量化共轭梯度法 Trainscg
拟牛顿法 Trainbfg
一步正割法 Trainoss
Levenberg-Marquardt trainlm

3.在同一个图中画出多条曲线并且加上多条曲线的区分名,比如说“曲线1”和“曲线2”,可以进行如下的调整:
plot(x,y1,’-’);
hold on;%和hold off是一对的,表示禁止图表刷新,防止新创建的曲线覆盖掉原先的曲线图
plot(x,y2,’o-’);
legend(‘a曲线’,’b曲线’);%legend会自动根据画图顺序分配图形
hod off;

4.关于神经网络工具箱nntraintool一些简单的介绍
其中Plots中有三个参数可选:Performance,Training State,Regression
Performance则是通过均方差开衡量网络的性能,可以看出,迭代次数越多,性能越好;
Regression字面上表示回归,它表明了与相对于训练目标、校验目标、测试数据集目标的输出,对于一个理想(完美)的拟合数据,数据应该沿着45度角,网络输出和目标相等。对于图中的解决对象,然和一种情形的R值都是0.95+,显然这种拟合是合理的。
Training State则是训练状态跟踪

5.BP神经网络做模式识别,问题通常分为两种:分类问题和回归问题,分类问题就是分类,对于最终的结果只能在某一些具体值之间进行选择(比如“好”、“坏”;比如“故障1”、“故障2”,而不会是其他的输出),而回归的问题是指最终的结果可以是随意的数(比如我最后的输出可以是100,也可以是100.01或者100.03等等),所以目前做的故障诊断是做的一个
分类的问题,可以用matlab中自带模式识的函数,创建神经网络的时候不要使用newff函数,而是使用Patternnet创建神经网络来进行数据训练:可以看Matlab中自带的螃蟹的例子,或者《神经网络之家》的上的一个神精网络模式识别的例子—螃蟹识别

6.对于一个神经网络,我们可以改变的东西主要有:
1.输入输出的格式和质量
2.各个神经元的权重w
3.偏执bias(也叫阈值、threshold),从广义上讲,也是改变权重w0
4.激活函数
5.神经网络层数
6.每一层神经元的个数
7.神经网络的结构
下面依次来看这些东西的改变:
激活函数的选取,要么使用默认的,或者都试一下哪个好用就用哪个
线性函数Liner Funcation,Matlab中使用purelin函数

域值函数Threshold Function,Matlab中使用hardlim或者hardlims,这两个函数的值域分别为[0,1]和[-1,1]

S形函数Sigmoid Function,Matlab中使用logsig函数

双极S形函数,Matlab中使用tansig函数

2.各个神经元的权重值W和偏置bias
我们输入网络数据,再输出数据,就是为了改变W和bias,使网络更符合要求,对于如何修改W和bias,是借助于一定的训练算法和学习算法来完成的。这些训练算法和学习算法,对应于Matlab中就是一些训练函数和学习函数。总结下来有下面两种训练算法:有监督学习算法和无监督学习算法。
1.有监督学习算法,也叫有教师学习算法等等,但是记住英文名就可以了:Supervised Learning,简单来说就是:我们输入许多数据,经过神经网络后会有输入数据,根据这个输出数据和期望的输出数据的差值大小,进而来调整权重和bias。有下面两点注意:
(1)期望输出哪里来的?其实我们用一些数据来训练网络,那么肯定得有输入输出数据,这个输出就是我们的期望输出数据,而网络的输出就是实际输出,随着不停的调整权重和bias,这个差值会越来越小。例如输出大于期望,那么就可以减小权重,或者使bias更负一些等等。
(2)初始权重和bias如何选择?默认是随机分配的,因此对于我们创建的神经网络,每一次训练运行,结果都会不同的,就是因为初始权重和bias是随机的。想保存最好的一次状态,可以save filename net来进行保存。
2.无监督学习算法,也叫无教师学习算法等等,但是记住英文名就可以了:UnSupervised Learning,大概思想是:当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。具体不再详细讲解。
简单来说,就是train是全局的调整权重和bias,而learn是调整局部的神经元的权重和bias。

3.神经网络层数、每一层神经元个数、神经网络的结构
简单来说就是选择不同的网络,如BP,RBF、Hopfield等网络,有机会在介绍这些具体的网络时,可以深入的讲一讲。

4.输入输出的格式和质量
输入数据的质量:保证输入数据准确完整等等就行,具体看数据预处理
输入输出数据的格式:归一化的处理,需要归一化的原因有:
(1)输入输出数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。例如有些输入数值是高度,而有些是温度,纯数字大小很差别很大。

(2)数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。

(3)由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函 数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。

(4)S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067。

5.BP神经网络输入输出
BP神经网络的输入:输入矩阵每列是一个样本数据,每行作为一类的特征
BP神经网络的输出:输出矩阵每列为对应输入的输出

6.模式识别函数patternnet,利用模式识别函数来创建神经网络
模式识别网络是一种前馈网络,训练之后可以用于根据目标类对输入进行分类,目标类应该是由很多0和一个1组成,1的位置就代表数据所属的分类,适用语法如下:
net=patternnet(hiddenSizes,trainFcn,performFcn);
如上所示,主要有3个参数, hiddenSizes表示隐含层的神经元,默认是10;trainFcn是训练函数,默认值是trainscg; performFcn是性能函数,默认值是crossentropy;如果想要有两个隐含层,每层的神经元都是10个,则可以写成net = patternnet([10,10]) ;
主要流程如下:

net.trainParam.epochs=1000; %最大训练次数(缺省值为10)
net.trainParam.show=25;%显示训练迭代过程(NaN表示不显示,缺省为25),每25次显示一次
net.trainParam.showCommandLine=0;%显示命令行(默认值是0) 0表示不显示
net.trainParam.showWindow=1; %显示GUI(默认值是1) 1表示显示
net.trainParam.goal=0;%训练要求精度(缺省为0)
net.trainParam.time=inf;%最大训练时间(缺省为inf)
net.trainParam.min_grad=1e-6;%最小梯度要求(缺省为1e-10)
net.trainParam.max_fail=5;%最大失败次数(缺省为5)
net.performFcn='mse';%性能函数
下面以鸢尾花数据集分类的情况为例:
[x,t] = iris_dataset;%读取鸢尾花数据集
net = patternnet(10);%创建模式识别网络
net = train(net,x,t);%传入数据训练
view(net)%查看网络
y = net(x);%用数据集x仿真网络
perf = perform(net,t,y);%传入网络、期望输出、仿真输出计算网络性能
classes = vec2ind(y);%向量变索引,得到一个索引行向量(除了大于阈值的那个位置为1其他都为0),得到的东西就是1的位置序号

在模式识别中如果只有两类则可以使用0和1来表示,如果大于等于3类正常都是使用1个1和多个0来表示。评判模式识别的参数有两个参数:Plot Confusion和Plot ROC,关于混淆矩阵和ROC下面做详细解释,如果对当前的performace不满意的话,可以对有以下的一些途径来提高:提高隐含层神经元的个数(Number of Hidden Neurons)

Matlab中神经网络工具箱打开命令:nnstart,
以时间序列的预测为例,首先打开神经网络工具箱nnstart,然后选Time SeriesTool,接下来时间预测分为三类,
第一类是当前的输出不仅依赖于当前的输入也依赖于过去的输出(有x有y)

第二类是仅取决于过去的输出(无x,有y)

第三类是仅有输入没有输出(有x无y)

点击下一步,这里先选第一种情况进行创建网络。选择输入数据和输出数据,Timestep数据类型一般是选Matrix row类型(即样本数据是以列向量的形式存在于矩阵中),如下图

然后点击下一步进行训练数据、验证数据以及测试数据的划分,再下一步进行隐含层神经元节点的数目的选择如下:

这里的1:2代表着当前的输出y(t)依赖于x(t-1)和x(t-2),同时依赖于y(t-1)和y(t-2)。如果一个神经元网络非常的非线性,那么可以增加Number of Hidden Neurons(隐含层神经元的个数)或者Number of delays(时间相关的序列个数),然后下一步进行训练,这里面有两个参数来判定准确性:Plot Error Autocorrelation和Plot Input-Error Correlation,前者Plot Error Autocorrelation就是自相关,描述两个信号之间的关系,如果一个模型创建的很好,那么一个时间的误差更另一个时间的误差是没有任何关系的,完全独立,理想状态下应该是只有一条竖线,在上下两根红线之内的是可以接受范围内的误差,超出红线的就要看自己需求了。后者Plot Input-Error Correlation,如果模型理想的话,当前的误差应该跟之前的输入没有任何关系,所以最理想的是就是0这条横线,实际上只要他在两条红线之间都是可以接受的。如果上诉的两个参数不满足,有3中方式来做调整:1.重新训练,2.改变神经元的个数Number of Hidden Neurons 3.改变Number of delays.如果对上述结果满意就可以next来Code Generation来产生代码选择SimpleScript。
第二种创建网络的方式(NAR)–用过去的数据预测将来的数据,不考虑任何的输入(比如用过去的温度预测未来温度)
此时是没有输入的,只有输出,大致步骤和上面一样

7.混淆矩阵(Confusion Matrix)–针对模式识别(分类)
分类的种类数就是矩阵的行数(不包括最后一行),
每一行参数的意义在于:[1,1]表示本来数据属于第一类,系统判定为第一类(此时网络判定正确为绿色);[1,2]表示原来数据属于第一类,然后系统判定为第二类(此时网络判定错误为红色),以此类推。综上,绿色框中的百分比越大越好,红色框中的百分比越小越好,理想的模型的混淆矩阵应该是只有对角线才上才有数据,其他位置为0,最终的结果就是将前面对角线的百分数加和得到最终的准确性(即最右下角的百分数)。灰色部分就是对应正确样本数占的比例。

混淆矩阵绿色表示正确命中,红色则表示误判,
最右下角的百分比代表整体的准确率

8.ROC曲线
横轴表示错误的决定,纵轴表示正确的决定,所以曲线越靠近(0,1)这个点效果越好,当曲线中只有这一个点,表示所有的判定都是正确的

4.神经网络matlab程序流程如下:样本数据P,样本数据的已知结果为T,这里需要注意的是P、T矩阵的输入形式,在样本数据中P,每一列表示一组输入数据而非每一行
步骤如下:

首先将样本数据和样本数据的结果进行归一化处理
[pn,pmin,pmax,tn,tmin,tmax]= premnmx(P,T);
2. 创建神经网络节点,net=newff(minmax(P),[8,6,1],{‘tansig’,’tansig’,’purelin’},’trainlm’);
3. 设置神经网络的相关训练参数,
net.trainParam.epochs=1000;%最大训练(迭代)的次数
net.trainParam.goal=0.00001;%训练的最小误差
等等这类参数
4. 进行神经网络的训练,将归一化后的样本数据以及结果数据输入传入训练函数,返回网络和网络里面的相关参数
[net,tr]=train(net,pn,tn);%注意这里传进去的参数矩阵是进行归一化之后的数据
5. 输入需要预测的数据,利用训练好的网络进行测试数据的预测,比如利用该网络与预测的数据为a,那么此时利用训练好的网络进行sim的仿真即可得到预测结果:
b=sim(net,a);
6. 上面步骤得到的预测结果是归一化之后的结果,真实的预测结果还需要对这结果进行反归一化的处理,利用postmnmx()函数进行处理,这里函数必须传入测试数据进行归一化之后得到最小值和最大值进行逆向操作,比如:
c=postmnmx(b,mint,maxt);
这里注意预测时,预测数据的输入归一化法则是利用训练输入数据的归一化法则进行操作,预测数据的输出数据则是利用训练数据的输出数据的归一化法则进行反归一化,这里一定要注意,否则预测数据可能与实际数据相差很大。这里的c就是利用训练好的神经网络进行预测数的结果预测结果

模式识别的创建过程:
如果分类的话只有2类,可以一类用0来表示,另一类用1来表示;如果有大与2类的分类,那么可以用多个0(表示非当前类)和1个1(表示当前类)表示。
首先要先将训练数据归类编码(100、010、001)
将数据导入Matlab中

打开模式识别工具箱:nprtool,选择对应的数据集
选择分类数据的比例:训练数据(默认70%)、验证数据(默认15%)、测试数据(默认15%),这里注意训练数据和验证数据是会改变网络的参数的,而测试数据则不会,仅仅做测试使用。
选择隐含层神经元节点数,分类越是非线性就适当的增加这个数目,默认为10
然后训练,训练完成有两个衡量网络的标准:混淆矩阵和ROC曲线

你可能感兴趣的:(算法)