(本文为自我总结的BP神经网络学习笔记,读者可能会有些地方不懂或者认为有错误的地方,请留言赐教或交流)
神经网络的构成为:输入层、隐含层、输出层;
每层都含有数个神经元;
X1,X2,……,Xn 为输入层神经元,其中n为神经元的个数;
h1,h2,……,hp为隐含层神经元,其中p为隐含层神经元的个数;
隐层神经元的个数一般是由经验确定无固定公式,参照:p = √(n + m) + a,
其中,n为输入层神经元个数, m为输出层神经元个数, a为[1,10]之间的常数
y1,y2,……,ym 为输出层神经元,其中m为输出层神经元的个数;
每层神经元有加权值w和截距b参数;(这里类似于一次函数的转换关系)
这里权值w和截距b一般选择在[0,1]之间的随机数;
激励函数:隐含层和输出层神经元中的每个神经元都有激励函数,一般激励函数都用sigmoid函数,这个函数的输出在[0,1]或者[-1,1]之间;
正向传递过程是(以单个隐含层为例):输入层,经过加权加参后,作为隐含层的输入,传入隐含层,经过隐含层的激励函数得到隐含层的输出,这个输出经过加权加参,作为输出层的输入,再经过输出层神经元的激励函数,得到输出;
反向训练:这个过程是通过训练函数,从实际输出值与目标输出值的误差出发,计算每个权值w和截距b对误差的影响,通过反复迭代,从而反复修改这两个参数,最后使训练集数据的实际输出与目标输出的误差达到最小;
训练函数有几种: 1,traingd;(标准BP算法)
2,traingdm;(增加动量法)
3,traingdx;(自适应学习率)
4,trainrp;(弹性BP算法)
5,trainlm;(Levenberg-Marquardt,也称为L-M算法,经常用这个)
接下来,介绍神经网络的步骤:
1. 首先进行初始化,即确定要输入数据所对应的目标输出,加权值w和截距b;
2. 正向传递,即输入数据通过隐含层和输出层得到实际输出;
这里在输入的数据中,需要对数据进行归一化,因为sigmoid函数的输出在[0,1]或者[-1,1]之间;
3. 误差反向传播,即计算实际输出与目标输出的误差,然后通过训练函数反向训练,计算w和b对误差的影响;
4. 修改权值,即通过计算后得到影响则对其修改,实际计算中有个学习速率作为其修改参数;
5. 重新验证误差精度;
重复上诉步骤进行迭代。
泛化过程:最后得到训练好的神经网络之后,利用新的数据作为输入,得到的输出就是我们想要的输出。
在故障诊断中的应用:
例如在正常数据的输出为(0,0,0),故障类别中规定了(1,0,0)(0,1,0)(0,0,1)这三种故障;
那么我们只需要选取的输出神经元个数为3(注意:这里的3不是对应三种,而是对应的3个输出值);
例如我们通过一个(21,9,3)结构的神经网络(21为输入层神经元个数,9为隐含层神经元个数,3为输出层神经元个数);
输入21个特征数据得到输出为(0.11, 0.95,0.12),那么我们通过误差计算就可以判定为是第二种(0,1,0)故障类别。
下面举个matlab例子,引荐于:https://www.cnblogs.com/sallybin/p/3169572.html
根据表1,预测序号15的跳高成绩。
表1 国内男子跳高运动员各项素质指标
序号 |
跳高成绩() |
30行进跑(s) |
立定三级跳远() |
助跑摸高() |
助跑4—6步跳高() |
负重深蹲杠铃() |
杠铃半蹲系数 |
100 (s) |
抓举 () |
1 |
2.24 |
3.2 |
9.6 |
3.45 |
2.15 |
140 |
2.8 |
11.0 |
50 |
2 |
2.33 |
3.2 |
10.3 |
3.75 |
2.2 |
120 |
3.4 |
10.9 |
70 |
3 |
2.24 |
3.0 |
9.0 |
3.5 |
2.2 |
140 |
3.5 |
11.4 |
50 |
4 |
2.32 |
3.2 |
10.3 |
3.65 |
2.2 |
150 |
2.8 |
10.8 |
80 |
5 |
2.2 |
3.2 |
10.1 |
3.5 |
2 |
80 |
1.5 |
11.3 |
50 |
6 |
2.27 |
3.4 |
10.0 |
3.4 |
2.15 |
130 |
3.2 |
11.5 |
60 |
7 |
2.2 |
3.2 |
9.6 |
3.55 |
2.1 |
130 |
3.5 |
11.8 |
65 |
8 |
2.26 |
3.0 |
9.0 |
3.5 |
2.1 |
100 |
1.8 |
11.3 |
40 |
9 |
2.2 |
3.2 |
9.6 |
3.55 |
2.1 |
130 |
3.5 |
11.8 |
65 |
10 |
2.24 |
3.2 |
9.2 |
3.5 |
2.1 |
140 |
2.5 |
11.0 |
50 |
11 |
2.24 |
3.2 |
9.5 |
3.4 |
2.15 |
115 |
2.8 |
11.9 |
50 |
12 |
2.2 |
3.9 |
9.0 |
3.1 |
2.0 |
80 |
2.2 |
13.0 |
50 |
13 |
2.2 |
3.1 |
9.5 |
3.6 |
2.1 |
90 |
2.7 |
11.1 |
70 |
14 |
2.35 |
3.2 |
9.7 |
3.45 |
2.15 |
130 |
4.6 |
10.85 |
70 |
15 |
3.0 |
9.3 |
3.3 |
2.05 |
100 |
2.8 |
11.2 |
50 |
代码:
P=[3.2 3.2 3 3.2 3.2 3.4 3.2 3 3.2 3.2 3.2 3.9 3.1 3.2;9.6 10.3 9 10.3 10.1 10 9.6 9 9.6 9.2 9.5 9 9.5 9.7;
3.45 3.75 3.5 3.65 3.5 3.4 3.55 3.5 3.55 3.5 3.4 3.1 3.6 3.45;
2.15 2.2 2.2 2.2 2 2.15 2.14 2.1 2.1 2.1 2.15 2 2.1 2.15;
140 120 140 150 80 130 130 100 130 140 115 80 90 130;
2.8 3.4 3.5 2.8 1.5 3.2 3.5 1.8 3.5 2.5 2.8 2.2 2.7 4.6;
11 10.9 11.4 10.8 11.3 11.5 11.8 11.3 11.8 11 11.9 13 11.1 10.85;
50 70 50 80 50 60 65 40 65 50 50 50 70 70];
T=[2.24 2.33 2.24 2.32 2.2 2.27 2.2 2.26 2.2 2.24 2.24 2.2 2.2 2.35];
%分别对输入和输出进行归一化处理
[p1,ps] = mapminmax(P);
[t1,pst] = mapminmax(T);
%旧版本的归一化处理方式:[p1,minp,maxp,t1,mint,maxt]=premnmx(P,T);
%创建网络
net = feedforwardnet([6,1],'trainlm');
%这里6代表隐含层神经元个数,1代表输出层神经元个数,'trainlm'是我们的训练函数
%旧版本的创建网络方式:net=newff(minmax(P),[8,6,1],{'tansig','tansig','purelin'},'trainlm');
%设置训练次数
net.trainParam.epochs = 1000;
%设置收敛误差
net.trainParam.goal=0.0000001;
%训练网络
[net,tr]=train(net,p1,t1);
%输入数据
a=[3.0;9.3;3.3;2.05;100;2.8;11.2;50];
%将输入数据归一化
[a,psa]=mapminmax(a);
%放入到网络输出数据,也就是上文中泛化过程
b=sim(net,a);
%将得到的数据反归一化得到预测数据
c=mapminmax('reverse',b,pst) ;%这里pst是归一化方式,反归一化按照上面输出T的归一化方式进行反归一化
c
下面是运行结果,注:不同的训练函数运行的结果不同,迭代次数也不同,我们应用的trainlm算法迭代次数最少
c =
2.2771
(8次)
参考文献:大数据在滚动轴承故障诊断中的应用研究_白广晨