今天主要说下自己学习BP神经网络的经验,废话不多说,直接进入主题。
首先我提出第一个问题,什么是神经网络?
我这里简单的回答下,就是用机器模拟人的思考方式的一种数学工具。人的大脑最重要的一个特性是学习,而神经网络正好是一种学习型的网络,具体的关于神经网络的了解请查资料看书。
接着提出第二个问题,我们什么时候使用神经网络?不要听这这个名字比较牛逼就去用这个。这里我按自己看到的资料来总结下啥时候用神经网络:
通常情况下,我们给系统加载一个输入,就会有一个输出,我们研究的时候可以给这个系统建立一个数学模型,如果我们知道具体的数学模型,当然,在来一个输入,我们肯定可以预测到其输出。但是,有些情况下,这个系统的数学模型我们是找不到的,或者找到是非常困难的,这个时候我们可以考虑使用使用神经网络,神经网络是一个黑盒模型,我们不可能向具体的数学模型上一样知道其具体的结构。
此外,神经网络是一种误差网络,即正确率不可能到100%,因此如果要求控制的系统必须达到百分之百的准确的情况下,神经网络是不可以使用的,比如火箭和导弹这类的控制上就不能使用神经网络,那可是高危险的事情,有百分之一的误差都不可以。
接下来提出第三个问题,我们使用神经网络用来干啥?基本
上的使用神经网络有两类,第一类是用神经网络来分类,第二类是用神经网络来回归,即拟合,然后我们给一个未来的输入,通过神经网络便可以预测未来的输出了。
第四个问题,我们训练的神经网络是有导师的还是无导师的,无导师的一般用在聚类里面。详细的可以自己查资料。
接下来还有几个问题,但是毕竟初学,先了解这么多,余下的以后用到在了解学习。
最后在废话一句,一般情况下我们训练好的神经网络可以用在分类,控制,统计等方方面面,应该说功能还是比较强大的。
今天我先通过编程实现一个BP神经网络的例子,以后我还会接续说到RBF(基于径向基函数)神经网络,(Hopfield)霍普菲尔德神经网络,支撑向量机(SVM),SOM神经网络。
关于BP神经网络的概念及推到就不再多说,有兴趣看书,我直接通过一个例子来写程序了。
例子:这里有新疆伊犁河23年实测的年径流和4个相关影响
因子的数据,要求利用BP神经网络建立4个相关影响因子和年径流的数学模型。建立好模型以后我们就可以对以后的年径流进行预测了。数据如下,为一个23行,5列的矩阵,前4列为4个影响因子的数据,最后一列为年径流的数据。
114.6,1.1,0.71,85,346; 132.4,0.97,0.54,73,410; 103.5,0.96,0.66,67,385; 179.3,0.88,0.59,89,446; 92.7,1.15,0.44,154,300; 115,0.74,0.65,252,453;
163.6,0.85,0.58,220,495; 139.5,0.70,0.59,217,478; 76.7,0.95,0.51,162,341; 42.1,1.08,0.47,110,326; 77.8,1.19,0.57,91,346; 100.6,0.82,0.59,83,456; 55.3,0.96,0.4,69,300; 152.1,1.04,0.49,77,433; 81,1.08,0.54,96,336; 29.8,0.83,0.49,120,289; 248.6,0.79,0.5,147,483; 64.9,0.59,0.5,167,402; 95.7,1.02,0.48,160,384; 89.9,0.96,0.39,105.0,314; 121.8,0.83,0.44,94.0,401; 78.5,0.89,0.44,94.0,280; 90.0,0.95,0.43,89.0,301;
写到这里又有些困了,本想写详细点,算了,还是直接上程序,在这之前我说注意的一些:
BP神经网络中一般隐含层的神经元个数是输入层的两倍多一点点,这里有四个影响因子,因此输入应该为4,输出为年径流,即输出为1个,隐含层的神经元个数取8个以上便可以了,我取得是9个。接下来直接上程序:
close all; clear; clc;
%origianl data; xy=[
114.6,1.1,0.71,85,346; 132.4,0.97,0.54,73,410; 103.5,0.96,0.66,67,385; 179.3,0.88,0.59,89,446; 92.7,1.15,0.44,154,300; 115,0.74,0.65,252,453; 163.6,0.85,0.58,220,495;
139.5,0.70,0.59,217,478; 76.7,0.95,0.51,162,341; 42.1,1.08,0.47,110,326; 77.8,1.19,0.57,91,346; 100.6,0.82,0.59,83,456; 55.3,0.96,0.4,69,300; 152.1,1.04,0.49,77,433; 81,1.08,0.54,96,336; 29.8,0.83,0.49,120,289; 248.6,0.79,0.5,147,483; 64.9,0.59,0.5,167,402; 95.7,1.02,0.48,160,384; 89.9,0.96,0.39,105.0,314; 121.8,0.83,0.44,94.0,401; 78.5,0.89,0.44,94.0,280; 90.0,0.95,0.43,89.0,301; ]; x=xy(:,1:4); y=xy(:,5); r=size(x,1);
%norminazed data;
x1=(x-ones(r,1)*min(x))./(ones(r,1)*(max(x)-min(x))); y1=(y-min(y)*ones(r,1))./((max(y)-min(y))*ones(r,1));
%generate train data and test data;
temp=randperm(r); %generate random permutation;
%train data;
D_train=x1(temp(1:19),:)'; T_train=y1(temp(1:19),1)';
%test data;
D_test=x1(temp(20:r),:)'; T_test=y1(temp(20:r),1)';
%create BP neural network; net=newff(D_train,T_train,[9,1]); %training parameters setting; net.trainParam.epochs=10000; net.trainParam.goal=0.001; net.trainParam.lr=0.2;
%tain BP neural network;
net=train(net,D_train,T_train);
%simulate the BP model; T_sim=sim(net,D_train); T_sim_test=sim(net,D_test); %show results; figure(1);
plot([T_train,T_test],'b-O'); hold on;
plot([T_sim,T_sim_test],'r:^'); xlabel('Sample Number'); ylabel('The value');
legend('True value','Predictive value');
将神经网络训练好以后,将这些实际数据输入神经网络得到预测的输出,然后再和实际的输出显示在同一图上,用来判断神经网络的性能,如下图:
因篇幅问题不能全部显示,请点此查看更多更全内容