第一步:看看入门书籍,对神经网络有个初步认识;
第二步:掌握如下算法:
1.感知机,这个较简单易懂,就不多说了
2.最小均方,这个原理是下面提到的神经习算法的理论核心,入门者要先看《高》(高等教育出版社,同济大学版)第8章的第十节:"最小二乘法"。
3.在第2步的基础上看Hebb学习算法、SOM和K-近邻算法,上述算法都是在最小均方误差基础上的改进算法,
容易买到的参考书籍有:
《神经网络原理》(机械工业出版社Simon Haykin著,中英文都有);
《人工神经网络与模拟进化计算》(清华大学出版社,阎平凡,张长水著);
《模式分类》(机械工业出版社, Richard O. Duda等著,中英文都有);
《神经网络设计》(机械工业出版社,Martin T. Hargan等著,中有)。
4.ART(自适应谐振理论),该算法的最通俗易懂的读物就是《神经网络设计》(机械工业出版社,Martin T.Hargan等著文都有)的第15和16章。若看理论分析较费劲可直接编程实现一下16.2.7节的ART1算法小节中的算法.
5.BP算法,初若对误差反传的分析过程理解吃力可先跳过理论分析和证明的内容,直接利用最后的学习规则编个小程序并测试,建议看《机器学习》(机械工业出版社,Tom. Mitchell著,中英文都有)的第4章和《神经网络设计》(机械工业出版社,Martin T.Hargan等著,中英文都有)的第11章。
第三步:在掌握上述算法的看各种前馈网络、反馈网络、联想存储器、神经网络集成、模糊神经网络等技术就属于学习神经网络的高级阶段了,需要根据自己的研究和应用方向决定。
神经网络高级话题:
神经网络研究的高级阶段是研究各种神经网络(包括多层感知器网络基函数网络、概率神经网络、径向基概率神经网络、递归神经网络、光学神经网络、库仑能量网络、隐马尔科夫模型、模糊极大极小网络、模块神经网络、学习委、ARTMAP网络、自适应共振理论(ART1-3)、自组织射、联想记忆、主分量分析、独立分量分析、盲源分离、硬聚类和模糊聚空间理论、波尔兹曼机、神经认知机、统计学习理论、支撑矢量机、随机神经网络理论、EM算法、遗传与进化算法、增强学习理论、人工免疫算法、模拟退火算法)的数学理论、学习算法、模型和结构、推广能力、预测与逼近能力。
神经网络领域:
神经网络在模式识别、图象处理、数据挖掘、机器人、生物信息学等领域被广泛应用。
1、我的目前一般的神经网络,尤其是前馈网络可以做的是两方面的问题:分类和函数拟合(包括预测)。当然,hopfield网络还具有联想记忆功能,可以做一些相关的事情。
2、我觉得神经网络还处于初期阶段,很多问题,尤其是规模大或者要求精度高的问题,还是解决不了的,不要总是怀疑自己是不是程序错了或者有什么问题之(说实话,我觉得神经网络进入工程还有很长的路要走。做论文还可以,呵呵)
3、一般来说,前馈网络的样本都是要采取归一化的,原因是样本的数量级差太大的话会出现大样本吞吃小样本的现象,使得数量一维样本不起作用。
人工神经网络的以下几个突出的优点使它近年来引起人们的极大关注:
(1)可以充分逼意复杂的非线性关系;
(2)所有定量或定性的信息都等势分布贮存于网络内的各神经元,故有很强的鲁棒性和容错性;
(3)采用并行理方法,使得快速进行大量运算成为可能;
(4)可学习和自适应不知道或不确定的系统;
(5能够同时处理定量、定性知识。
人工神经网络的特点和优越性,主要表现在三个方面:
第一,具有自学习功能。例如实现图像识别时,只在先把许多不同的图像样板和对应的应识别的结果输入人工神经网络,网络就会通过自学习功能,慢慢学会识别类似的图像。自学习功能对于预测有特别重要的意义。预期未来的人工神经网络计算机将为人类提供经济预测、市场预测、效益预测,其应用前途是很远大的。
第二,具有联想存储功能。用人工神经网络的反馈网络就可以实现这种联想。
第三,具有高速寻找优化解的能力。寻找一个复杂问题的优化解,往往需要很大的计算量,利用一个针对某问题而设计的反馈型人工神经网络,发挥计算机的高速运算能力,可能很快找到优化解。
网络的研究可以分为理论研究和应用研究两大方面。
理论研究可分为以下两类:
1).利用神经生理与认知科学研究人类思维以及智能机理。
2).利用基础理论的研究成果,用数理方法探索功能更加完善、性能更加优越的神经网络模型,深入研究网络算法和性能,如:稳定性、收敛性、容错性、鲁棒性等;开发新的网络数理理论,如:神经网络动力学、非线性神经场等。
应用研究可分为以下两类:
1).络的软件模拟和硬件实现的研究。
2).神经网络在各个领域中应用的研究。这些领域主要包括:
模式识别、信号处理、知识工程、专家系统、优化组合、机器人控制等。随着神经网络理论本身以及相关理论、相关技术的不断 发展,神经网络的应用定将更加深入。
3 如何选择训练集和测试集数据?
一般需要将样本分成独立的三部分训练集(train set),验证集(validation set)和测试集(testset)。其中训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最择最优的模型的性能如何。一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。
样本少的时候,上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱,然后成K份,轮流选择其中K-1份训练,剩余的一份做验证,计算预测误差平方和,最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的取N,就是留一法(leaveone t)。
我个人认为首先是对实际问题分析,看传统的方法行不行,如果行就传统方法解决,如果传统方法解决的不理想,然后尝试用神经网络,神经网络用于求解问题是因为它具有"学习"能力,对于非线性、有噪、模式识别等问题有着得天独厚的优势,对于问题分析以后,重在选择相应的模型求解模型的求解过程同时也涉及到模型的优化等问题,最后编制程序运行。我个人认为选择什么样的模型求解实际问题是最关键的,用什么语言编程实现或者怎么实现好象都不是那么难。个人观点,欢迎补充。
权值和阈值是神经元之间的连接,将数据输入计算出一个输出,然后与实际输出比较,误差反传调整权值和阈值
假如p1=[1 1 -1]';
p2=[1 -1 -1]';
属于不同的类
须设分类器将他们分开
这里用单层神经元感知器
初始权值 w=[0.2 0.2 0.3] b=-0.3
输出 a1 a2
ahardlims(w*p1+b)
a2=hardlims(w*p2+b)
如果不能分开,还须不断调整w,b
这里说明一下权值w 阈值b 而已
简单地说,阈值也可以看作一维权值,只不过它所对应一维样本永远是 -1(也有上说是1),这样就把输入样本增加了一维,更有利于解决问题.
p=[9 8 1232 18 3 0 3 10 3 6 14 8 20 2 11 24 0 9 6 3 5 3 1 3 14 2 10 2 3 17 51 61 7;
66 29 11 34 13 3 0 1 14 4 12 11 8 12 2 13 20 0 4 3 4 5 4 1 0 12 0 93 250 4 3 0 58 3;
61 30 12 35 6 2 0 1 11 7 5 9 11 17 2 3 2 4 3 5 5 4 2 0 16 5 12 4 211 4 1 59 2;
79 28 18 43 7 6 1 5 9 6 6 20 17 30 1 12 20 0 9 5 2 5 5 3 2 16 5 143 249 20 3 0 56 3;
94 38 15 9 4 1 3 13 2 12 15 10 27 2 17 16 2 4 3 4 9 4 2 0 20 7 10 0230 37 2 68 6;
106 53 16 44 17 3 0 2 15 3 18 12 7 19 11 0 32 0 4 9 2 6 6 3 2 8 010 4 331 25 1 1 104 5;
106 55 18 17 3 1 2 14 3 11 16 11 29 1 13 12 0 3 8 3 10 7 3 5 5 7 71 529 50 7 1 141 0;
113 75 19 29 42 9 2 3 26 0 13 21 5 2 5 27 1 5 20 2 5 18 4 4 1 3 5643 30 2 7 120 4;
110 62 18 30 18 6 0 5 17 1 18 10 14 1 6 18 0 3 14 6 6 24 5 5 11 618 4 573 42 2 4 122 4;
114 93 23 28 29 6 0 9 23 4 8 25 15 36 0 4 28 3 5 16 4 2 36 3 2 9 127 699 54 8 8 139 8;
152 107 23 48 50 15 2 4 29 4 20 29 13 40 1 7 42 3 7 28 4 18 50 6 313 3 23 3 785 30 7 5 207 10]';
%目标向量
t=[79 28 18 43 7 6 1 5 9 6 6 20 17 30 1 12 20 0 9 5 2 5 5 3 2 16 514 3 249 20 3 0 56 3;
94 8 15 39 9 4 1 3 13 2 12 15 10 27 2 17 16 2 4 3 4 9 4 2 0 20 7 100 37 2 0 68 6;
106 53 16 44 17 3 0 2 15 3 18 12 7 19 11 0 32 0 4 9 2 6 6 3 2 8 010 4 33 5 1 1 104 5;
106 18 21 17 3 1 2 14 3 11 16 11 29 1 13 12 0 3 8 3 10 7 3 5 5 7 71 529 50 7 1 141 0;
113 75 19 29 42 9 2 3 26 0 13 21 5 6 2 5 27 1 5 20 2 5 18 4 4 1 3 75 643 30 2 7 120 4;
110 62 18 30 18 6 0 5 17 1 18 10 14 24 1 6 18 0 3 14 6 6 24 5 5 116 18 4 573 42 2 4 122 4;
114 93 23 28 29 6 0 9 23 4 8 25 15 36 0 4 28 3 5 16 4 2 36 2 7 9 127 699 54 8 8 139 8
152 107 23 48 50 15 2 4 29 4 20 29 13 40 1 7 42 3 7 28 4 18 50 6 313 3 23 3 785 30 7 5 207 10;
111 124 15 31 14 0 2 27 2 12 20 7 29 0 42 17 2 7 11 2 8 12 5 6 4 323 1 703 25 4 170 4;
144 116 24 52 52 12 1 4 12 3 11 28 14 45 2 19 18 0 5 17 6 11 14 413 15 5 31 3 674 24 6 9 166 7]' ;
%归一化
u=t;
%%%%%%归 0 1 之间
for i=1:35
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
for i=1:35
t(i,:)=(t(i,:)-min(t(i,:)))/(max(t(i,:))-min(t(i,:)));
end
%训练
%%%%%%%%threshold的作用是限定输入的范围,因为已经做过归一化,所以输入的范围在0 1之间
%%%%%%%%%%这个范围比输入的范围大是可以的,举个例子,比方说归一化的数据是在[0.1 0.9之间
%%%%%%%%%%范围用[0 1]是可以的,比归一化后的范围如果小的话,就会出问题
threshold=[0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 01; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 0 1; 01; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1];
net=newff(threshold,[19,35],{'tansig','logsig'},'trainlm');
%%%%%%%%%隐层数 隐层数的确定有几个经验公式,也可以用试算法
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.001;
%训练结束的目标
LP.lr=0.1;
%这个应该是学习率
net.trainParam.show=20;
P=[p(:,1)+p(:,2)+p(:,3) p(:,2)+p(:,3)+p(:, p(:,3)+p(:,4)+p(:,5)p(:,4)+p(:,5)+p(:,6) p(:,5)+p(:,6)+p(:,7) p(:,6p(:,7)+p(:,8)p(:,7)+p(:,8)+p(:,9) p(:,8)+p(:,9)+p(:,10)p(:,9)+p(:,10(:,11)];
T=[t(:,1) t(:,2) t(:,3) t(:,4) t(:,5) t(:,6) t(:,7) t(:,8)t(:,9)];
%输本的输入和目标
net=train(net,P,T);
%训练网络
test=[ t(:,7)+t(:,8)+t(:,9)];
out=sim(et,test); %仿真预测
%反归一化
for =1:35
prict(i)=out(i)* (max(u(i,:))-min(u(i,:)))+min(u(i,:));
end
predict
%结果整理
predictsum=predict(1);
sum=u(1,10);
for i=1:34
predictsum= predictsum +predict(i+1);
sum=su(i+1,10);
end
sum
prictsum
sumerror= predicm-sum
%绘制预报曲线
x=[t(:,10)];
a=x-o;
for i=1:35
error=a* (max(u(i,:))-min(u(i,:)))+min(u(i));
end
X=1:35;
figure(1);
pt(X,error)
xlabel('地上管网急修作业类型(X)');
ylabel('作业量预测误差(Y)');
figure(2);
plot(X, predict,'r*',X,u(:,10),'bo')
xlabel地上管网急修作业类型(X)');
ylabel('作业量(Y)');
text (23,predict(30), 'predicted data');
text(25.5,u(30,10), 'real data');
看了研学和ai创业研发俱乐部神经网络版及振动论坛部分帖子内容,对归一化做一下整理,冒昧引用了一些他人的观点,有的未列出其名,请谅解
----------------------------------------------------------------------------------------
关于神经网络归一化方法的整理
由于采集的各数据单位不一致而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:(by james)
1、线性函数转换,表达式如下:
(x-MinValue)/(MaxValue-MinValue)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
2、对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。
3、反函数转换,表达式如下:
y=atan(x)*2/PI
----------------------------------------------------------------------------------------
归一化是为了加快训练网络的收敛性,可以不进行归一化处理
归一化的具体作用是归纳统一样本的统计性。归一化在0-1之间是统计的概率分布一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;
有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
归一化是因为sigmoid函数的取值是0到1,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.90. 0.1]就要比用[1 0 0]要好。
但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。
-------------------------------------------------------------------------------------
关于用premnmx语句进行归一化:
premnmx语句的语法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)
其中P,T分别为原始输入和输出数据,minp和maxp为P中的最小值和最大值。mint和maxt分别为T的最小值和最大值。
premnmx函数用于将网络的输入数据或输出数据进行归一归一化后的数据将分布在[-1,1]区间内。
我们在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx。
下面介绍tramnmx函数:
[Pn]=tramnmx(P,minp,maxp)
其中P和Pn分别为前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
(by terry2008)
---------------------------------
matlab中的归一化处理有三种方法
1 premnmx、posnmx、tramnmx
2. restd、poststd、trastd
3. 自己编程
具体用那种方法就和你的具体问题有关了
(y happy)
----------------------------------
pm=mabs(p(i,:))); p(i,:)=p(i,:);
和for i=1:27
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end 可以归一到0 1 之间
0.1+(x-min)/(max-min)*(0.9-0.1)其中max和min分别本最大值和最小值。
这个可以归一到0.1-0.9
我对此发表点个人看法吧,我觉的网络不稳定属于正常现象,我以大家用的最多的BP网,比如网络隐含层节点的数目和网络训练算法选取的不同,都也可能导致同一网络结构针对同一测试样本的数据有着截然不同的解,原因是多方面的,与样本有关,BP算法自身也有关系,在网络初始化时,BP采用rand函数初始化权值,这样不同时间训练rand当然会有不同的取BP是按照梯度最大方向修正误差平方,网络自身算法就有一定的局限性。如果要保留现有的节点之间的值可以用
et.iw,net.b,net.lw保留,这样网络的值就可以保留下来了。不过有时与样本特征,数目也有关系,样本太少训练的结果也不会令人满意。个人观点,仅供参考。
输入层和输出层节点数选择由应用要求决定。输入节点数一般等于要训练的样本矢量维数,可以是原始数据的维数或提取的特征维数;元数在分类网络中取类别数m或log2m,在逼近网络中取要逼近的函数输出空间维数。当网络用于工业过程辨识或时间序列预测建模时,输入节的选择应由非线性系统定阶的结果确定。
网络的隐层数和隐节点数决定了网络的规模,而网络的规模与其性能密切相关。神经网络的规模越大,网络中的自由参数就越多;反之,网络中的自由参数就越果神经网络用于逼近一个目标函数(分类可以看成函数逼近的特殊情况),则当网络规模过小,神经网络逼近能力不足,容易导致欠拟合;网络规模过大,神经网能力过剩,则容易导致过拟合;因此,确定网络规模是神经网络设计的一项重要内容。
RBF网络与多层感知器都是非线性多层前向网?它们都是通用逼近?对于任一个多层感知器,总存在一个RBF网络可以代替?反之亦然.但是,这两个网络也存在着很多不同?1.RBF网络只有一个隐?而多层感知器的隐层可以是一层也可以是多层的.2多层感知器的隐层和输出层其神经元模型是一样的.而RBF网络的隐层神经元和输出层神经元不仅模型不?而且在网络中起到的作用也不一?3,RBF网的隐层是非线性的,输出层是线性的.然?当用多层感知器解决模式分类问题时,它的隐层和输出层通常先为非线性的.当用多层感知器解决非线性回归问,通常选择线性输出层.4,RBF网络的基函算的是输入向量和中心的欧氏距离,而多层感知器隐单元的激励函数计算的是输入单元和连值间的内?
1.RBF网络与多层感知器都是非线性多层前向网,都可以用于逼近。
2.相互代替的问题应该是不能不太清楚,一般是根据具体问题选择相应的网络。
3.RBF网络本质上只有一层,只有一层的权值需要调整。
4.在用多层感知器解决问题时,选择线性输出层还是非线性输出层主要取决于理想输出值是有限个还是无限个,因为非线性输出的值是2个值,而线性输出的值是连续的。
5.在做模式分类问题时,RBF网络的基函数计算的是输入向量和中心的欧氏距离而多层感知器隐单元的激励函数计算的是输入单元和连接权值间的内积。没错,简单地说,就是RBF网络是靠画圈分类,而多层感知靠画直线分类。
学习速率决定每一次循环中所产生的权值变化量。大的学习速率可能导致系统的不稳定,但小的学习速率会导致学习时间较长,可能收敛速度很慢,不过能保证网络的误差值不跳出误差表明的低谷而最终趋于最小误差值。所以在一般情况下,倾向于选取较小的学习速率以保证系统的稳定性。学习速率的范围一般选取在0.01-0.7之间。
隐单元的数问题的要求、输入/输出单元的数目都有着直接关系,数目太多会导致间过长、误差不一定最佳,也会导致容错性差、不能识别以前没有看到的样本,因此一定存在一个最佳的隐单元数。有三个公式可用于选择最佳隐层神经元时的参考经验公式(回复里面无法编辑公式,如有需要请查相关资料)。
还有一种途径:首先使隐单元的数目可变,或者放入足够多的隐单元,通过学习将那些不起作用的隐单元剔除,直到不可收缩为止。同样,也可以在开始时放入比较少的神经元,学习到一定次数后,如果不成功再增元的数目,直到达到比较合理的隐单元数目为止。(个人认为后面这种办法比经验公式可行,而且往往根据经验公式确定后还是需要通过后面的办法最后确定)
p=[1,15,25;2,15,25;3,15,25;4,15,25;1,15,22,5,25;2,7.5,25;2,10,25;2,15,25;];
t=[0.6169;0.7068;0.79989052;1.0881;3.4255;1.0509;0.8835;0.7068];
[pn,minp,maxp]=premnmx(p);
net=newff(max(pn),[9,12,1],{'tansig','tansig','purelin'},'traingdm');
net.trainparam.show=25;
net.trainparam.mc=0.9;
net.trainparam.lr=0.05;
net.trainparam.epochs=1000;
net.trainparam.goal=0.00001;
net=init(net);
[net,tr]=train(net,p,t);
出错的原因是 Error using ==> network/train
Targets are incorrectly sized for network.
Matrix must have 1 rows.
-------------------------------------------------------------------------
p t 的列数要相等
在[pn,minp,maxp]=premnmx(p);前面加入:p=p';t=t'。在使用工具箱进行网络训练时,要求训练样本的个体是列向量。
helpgensim
--- help for network/gensim.m ---
GSIM Generate a SIMULINK block to simulate a neural network.
Syntax
gensim(net,st)
netrainParam.show = 50;
net.trainPam.lr = 0.05;
net.trainParam.epochs = 10000;
net.trainParam.goal = 1e-5
-------------------------------------------------------------------
net.trainParam.show = 50;/训练50次刷新一下训练图
net.trainParam.lr = 0.05;//学习率
net.trainParam.epochs = 10000;//训练次数
net.trainPam.goal = 1e-5;//训练结束的目标
计算机学报 1998年 第21卷 第1期高大启《有教师的线性基本函数前向三层神经网络结构研究》中给出了初步计算隐层接点个数,和进一步精确接点个数的方法!!!
Neural Networks 18(2005)1341--1347 《sTABILITY ANALYSIS OF ATHREE-TERM BACKPROPAGATIONALGORITHM》中也有一些方法,请参考!!!
第一个文章请在这里下载:
http://www.2oft.cn/bbs/read.php?tid=269&fpage=2
①网络实质上实现了一个从输入的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题;
②网络能通过学习带正确答案集自动提取"合理的"求解规则,即具有自学习能力;
③网络具有一定的推广、概括能力。
多层前向BP网络的问题:
①BP算法的学习速度很慢,其原因主要有:
a 由于BP算法本质上为梯度下降法,而它所要优化的目标函数又非常复杂,因此,必然会出现"锯齿形现象",这使得BP算法低效;
b存在麻痹现象,由于优化的目标函数很复杂,它必然会在神经元输0或1的情况下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程顿;
为了使网络执行算法,不能用传统的一维搜索法求每次迭代的步长,而必须把步长的更新规则预予网络,这种方法将引起算法低效。
②网络训练失败的可能性较大,其原因有:
a从数学角度看,BP算法为一种局部搜索的优化方法,但它决的问题为求解复杂非线性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败;
b 网络的逼近、推广能力同学习样本的典型性密切相关,而从问题中选取典型样本实例组成训练集是一个很困难的问题。
③难以解决应用问题的实例规模和网络规模间的矛盾。这涉及到网络容量的可能性与可行性的关系问题,即学习复杂性问题;
④网络结构的选择尚无一种统一而完整的理论指导,一般只能由经验选定。为此,有人称神经网络的结构选择艺术。而网络的结构直接影响网络的逼近能力及推广性质。因此,应用中如何选择合适的网络结构是一个重要的问题;
⑤新加入的样本要影响已学习成功的网络,而且刻画每个输入样本的特征的数目相同;
⑥网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力降,即出现所谓"过拟合"现象。此时,网络学习了过多的样本细节,而不能反映样本内含的规律。
出现了过拟合iamqsar
神经网络计算不能追求训练误差最小,这样很容易出现过拟合
可以通过交的方法寻找相对较优的网络结构,在原来的论坛中我发过一个Matlab的源程序。
我不喜欢神经网络的最大的原因是他的重现性很差,但我还是来发文章,为了生计啊,有时候觉得这种行为有点不道德,但又无可奈何.
petroyb 在工程应用领域中,应用BP网络的好坏最关键的仍然是输征选择和训练样本集的准备,若样本集代表性差、矛盾样本多、数据归一化存在问题,那么,使用多复杂的综合算法、多精致的网络结构,建立起来的模型预测效果好。若想取得实际有价值的应用效果,从最基础的数据整理工作做起吧,弯路的。
cokie BPNN的一些问题是可以通过参数控制来改善如:
学习速率这个参数可以控制能量函数的步幅,并且如果设为自动调整,可
以在误差率经过快速下降后,将学习速率变慢而增加BPNN的稳定性。
惯性个参数则可以可以降低神经元权重变化的频率会使整个网络在
回想的计算过程中,由于太快而至不稳定。
我觉得BPNN的最大问题在于最优拓扑结构的构造,有些可输入层的变量
数来预估需要的神经元数量,但并非最好的结构,目前大部分使用遗传算
搜索最优结构。
只要BPNN结构优秀,一般20个输入函数以下的问题都能在500次的学习
收敛到最低误差附近。
至于过拟合"现象,只要能够实时检测误差率的变化就可以确定最佳的训练次
数,比如15000次左右的学习次数,如果你不观察,设成500000次学习,不仅
需要很长时间来跑,而且最后结果肯定令人大失所望。
训练好的权值、阈值的输出方法是:
输入到隐层权值:w1=net.iw{1,1}
隐层阈值:heta1=net.b{1}
隐层到输出层权值:w2=net.lw{2,1};
输出层阈值:theta2=net.b{2}
一般需要将样本分成独立的三部分训练集(trainset),验证集(validation set)和测试集(testset)。其中训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。
少的时候,上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱,然后均匀分成K份,轮流选择其中K-1份训练,剩余的一份做验证,计算预测误差平方和,最后把K次的预测误差平方和再做平选择最优模型结构的依据。特别的K取N,就是留一法(leaveone out)。
神经网络(BP)系列(1)关于样本的归一和反归一(初学者请看)
本书制作版权属智能中国网,如果文章原创者认为我们侵犯了您的合法权益,请来信告知
这个系列主要针对使用matlab 神经网络工具箱,对一些初学者容易理解错误的地方进行解析。
我的解析也可能有理解不对的地方,希望大家批评指正.
这个系列主要针对使用matlab 神经网络工具箱,对一些初学者容易理解错误的地方进行解析。
1. 神经网络一列为一个样本,所以对于matlab 而言,要求输入和输出的列一样的
经常有人问起的问题:
如
http://www.5iai.com/bbs/read.php?tid=5847&keyword=������
Error using ==> network/train
Targets are incorrectly sized fo network.
Matrix must have 1 rows.
解决:P T 的列数一样 ,如果不一样 P=p' t=t' 转置一下
2 归一
澄清一个对归一的错误理解1
样本矩阵为9行4列。9组样本,4个变量。现在归一化:
x=[68.7 66.6 5610 19.2;
89.9 90.8 4500 11.8;
120.8 120.6 6800 20.6;
169 40.4 6160 40.6;
180.8 69.8 7330 33.4;
190.3 130.2 7320 31.6;
109.8 151.1 57 86.1;
33.2 61.4 8255 22.6;
111.7 126.6 7040 13.6;]
写法一:
for i=1:9
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-n(x(i,:)))
end
结果:
0.0089 0.0085 1.0 0
0.0174 0.0176 1.0000 0
0.0148 0.0148 1.0000 0
0.0210 0 1.0000 0.0000
0.0202 0.0050 1.0000 0
0.0218 0.0135 1.00 00 0
0.0042 0.15 1.0000 0
0.0013 0.0047 1.0000 0
0.0140 0.01 1.0000 0
写法二:
x=x'
for i=1:4
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i))-min(x(i,:)))
end
结果:
Columns 1 through 8
0.2260 0.3609 0.5576 0.8644 0.9395 1.0000 0.4876 0
0.2367 0.4553 0.7245 0 0.2656 0.8112 1.0000 0.1897
0.2956 0 0.6125 0.4421 0.7537 0.7510 0.3340 1.0000
0.0996 0 .1184 0.3876 0.2907 0.2665 1.0000 454
Column 9
0.4997
0.7787
0.6764
0.0242
注意:写法 2为正确的归一化
对归一的错误理解2
将数据集分为训练集和测试集,对训练集和测试集分别做归一处理
所以就会有人问 如果我的测试集只有一个数据 如何归一呀
最大最小值从那里找呀
正确的理解是:
训练测试集的归一标准是一样的
建议:
如果训练集和测试集是一起归一的 可以自程实现归一
如果是训练集和测试集是分开的,最好是使用matlab自带的premnmx、postmnmx、tramnmx 函数
如果是自己编程的话 ,请注意训练集和测试集的归一标准需要一样
premnmx、postmnmx、tramnmx 函数
的使用例子如下:
Example
Here is the code to normalize a given data set s
that the inputs and targets will fall in the
range [-1,], using PREMNMX, and the code to train a network
with the normalized data.
p = [-10 -7.5 -5 -2.5 0 2.5 5 7.5 10];
t = [0 7.07 -10 -7.07 0 7.07 10 7.07 0];
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net = train(netn,tn);
If we then receive new inputs to apply to the trained
network, we will use TRAMNMX to transform them
first. Then the transformed inputs can e used
simulate the previously trained network. The
network output must also be unnormalized using
POSTMNMX.
p2 = [4 -7];
[p2n] = tramnmx(p2,minp,maxp);
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt);
这个是归一到-1 和 1 之间 那我要归一到0 1 之间怎么办
有人说可以使用加绝对值就归一到 0 1之间了
我觉得加绝对值可能会有些问题
比较好的方式是变换
P 在-1 1 之间
Pp=(p+1)/2 就可以归一到0 1
至于要归一到0.1 0.9 之间 选取合适的变换就可以做到了
神经网络每次结果不同解析
神经网络每次结果不同是因为初的权值和阈值是随机的
因为每次的结果不一样,才有可能找到比较理想的结果啊
找到比较好的结果后,用命令save filename net;保存网络,
可使预测的结果不会变化,调用时用命令load filename net;
取p_t=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err);
选择误差小的保存网络
save filename net
以后调用时
load filename net
p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err):
因为每次初始化网络时都是随机的,而且训练终止时的误差也不完全相同,结果训练后植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同
例子,这样初始化就能使网络的输出结果是一样的,另外也可以给网络特定的权值,一种方法是测结果后的效果比较好的权值做为初值
p=[0.8726 0.9441 0;0 0 0.7093;0.7378 0.7093 0.3795;0.6416 0.3790.7031;1 0.7031 0.4241;0.7774 0.4241 0.9559;0.955 0.50120.7052;...
0.8209 0.7052 0.4983;0.6011 0.4983 1;]';
t=[0 0.7378 .6416 1 0.7774 0.5012 0.8209 0.6011 0.9350];
rand('state',0);
net=newff(minmax(p),[6,1],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=2000;
net.trainParam.goal=0.001;
net=train(net,p,t);
y=sim(net,p);
error=y-t;
res=norm(error);
p_test=[0.9350 1 0.6236;]';
t_test=[ 0.8027]
a=sim(net,p_test)
rand('state',0);
这个的作用是每次初始化一样
0是种子数,如果换成其他数,就可以产同的随机值
注:rand('state',0);的使用有点为结果相相同,至于这样的结果网络性能是否达到好的要求则没有考虑,建议还是不要用这种方法使每次结果相同
用保存网络的方法吧
消除初值影响可以考虑的另一个方法是简单集成神
原理
由于选择不同的权值所得同,使最终神经网络泛化能力体现出一定的随机性。利用这个特性也可以改善神经网络的泛化能力,神经网络集成便是利用这种思路的体现,即先训练一组只初始权值不同的子网,然后通过各子网"表决(Voting)"的形式(如加权和)得到学习系统的输出。
当神经网络集成用于分类器时,集成的输出通常由个体网络的输出投票产生。通常利用绝对多数投票法(某分类成为最终结果当且仅当输出结果为该分类的神经网络的数目最多)。理论分析和大量实验表明,后者优于前者。因此,在对分类器进行集成时,目前大多采用相对多数投票法。
当神经网络集成用于回归估计时,集成的输出通常由各网络的输出通过简单平均或加权平均产生。Perrone等人认为,采用加权平均可以得到比简单平均更好的泛化能力。
输入输出设计:
对某一问题分析,影响网络性能的输入主要有5个指标,输出则分为8类。8类的话可以用三位二进制表示。
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
神经网络的输入为5维的向量,输出为三维的向量。输入的数据具有不同的单位和量级,所以在输入在输入神经网络之前应该首先进行归一化处理,将样本数据归一到01之间。
样本总共有328组数据
将样本集分为训练集和测试集
随机抽取70取做为测试测试集
其余的作为训练集
网络设计
采用tansig(x)和logsig(x)函数作为传输函数,tansig(x)如下式:
tansig=2/(1+exp(-2x))-1
logsig(x) 如下式:
logsig(x) = 1 / (1 + exp(-n))
对于有限个到输出的映射,并不需要无限个隐层节点,这就涉及到如何选择隐层节点数的问题,而这一问题的复杂性,使得至今为止尚未找到一个很好的式,隐层节点数往往根据前人设计所得的经验和自己进行试验来确定。设计网络时我采用的方法是通过神经网络训练来确定隐含层的个数,首先确定隐含层中节点数目的范围,设计一个隐含层神经元数目可变的BP网络,通过误差对比,确定的隐含层神经元的个数。最后确定的隐含层的个数为12。所以网络结构为5-12-3的三层结构。
load('CSHuju1.mat');
p=CC1(:,[1,3:)';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 ;
t=repmat(T,41,1)';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)n(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNumAllSamNum-TrainSamNum;%测试样本数
PerPos=andperm(AllSamNum)
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(::TrainSamNum)
TestDataIn=p(:,Pos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},'tralm');
%训练参数设置
net.trainParam.epochs=1000;
%训
net.trainParam.goal=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TinDataOut);
out=sim(net,TestDataIn)
训练结果:
TRAINLM, Epoch 000, MSE 0.296308/0.0001, Gradient83.9307/1e-010
TRAINLM, Epoch 20/1000, MSE 0.0224641/0.0001, Gradient6.7605/1e-010
TRAINLM, Epoch 40/1000, MSE 0.00563627/0.0, Gradient3.27027/1e-010
TRAINLM, Epoch 60/0, MSE 0.00348587/0.0001, Gradient1.49868/1e-010
TRAINLM, Epoch 80/1000, MSE 0.00247714/0.0001, Gradient0.459233/1e-010
TRAINLM, Epoch 100/1000, MSE 0.0018843/0.0001, Gradient0.289155/1e-010
TRAINLM, Epoch 20/1000, MSE 0.00148204/0.0001, Gradient0.392871/1e-010
TRAINLM, Epoch 140/1000, MSE 0.00119585/0.0001, Gradient00864/1e-010
TRAINLM, Epoch 160/1000, MSE 0.000980448/0.0001, Gradient0.391987/1e-010
TRAI, Epoch 180/1000, MSE 0.000779059/0.0001, Gradient0.389835/1e-010
TRAINLM, Epoch 200/1000, MSE 0.000606974/0.0001, radient0.310202/1e-010
TRAINLM, Epoch 220/1000, MSE 0.000388926/0.0001, Gradient0.331632/1e-010
TRAINLM, Epoch 240/1000, MSE 0.000143563/0.0001, Gradient403953/1e-010
TRAINLM, Epoch 248/1000, MSE 9.756e-005/0.0001, Gradient0.174263/1e-010
TRAINLM, Performance goal met.
训练好的权值、阈值的输出方法是:
输入到隐层权值:w1=net.iw{1,1}
隐层阈值:theta1=net.b{1}
隐层到输出层权值:w2=net.lw{2,1};
输出层阈值:theta2=net.b{2
>>w1=net.iw{1,1}
w1 =
1.7663 -2.8022 -0.7142 -2.1099 -2.4011
3.6614 -2.5297 -4.4295 5.0508 8.1899
4.4007 7.6775 -6.0282 6.1567 1.8775
4.5009 -9.9915 5.9737 5.0234 3.3931
0.2703 -2.8850 0.4482 -2.9153 1.3648
2.3769 3.3151 0.8745 3.1900 1.2608
-2.2815 -6.6847 1.8738 2.4093 -2.9033
-5.3332 6.1506 -8.4386 -6.7979 3.1428
-0.0135 -10.8942 -9.6333 7.2311 12.0693
2.3130 5.221 0.0155 2.9431 0.3135
-6.4017 -0.8987 0.1976 3.2527 0.1444
-3.6517 -1.6339 3.5505 2.4813 1.7880
>> theta1=net.b{1}
theta1 =
0.5955
-5.4876
-9.8986
-4.4731
3.6523
-4.0371
5.6187
5.7426
0.9147
-8.5523
-2.3632
-5.6106
>> w2=net.lw{2,1}
w2 =
Columns 1 through 8
-0.2751 -3.5658 -2.3689 -6.4192 -1.1209 1.5711 -1.7615 7.6202
-1.2874 -9.1588 -14.4533 7.5064 3.7074 0.9019 8.7033 -0031
3.3536 -0.8844 7.8887 0.9336 0.8410 -2.4905 1.0627 -9.3513
Columns 9 through 12
-2.5894 -1.9950 -3.0132 -4.700
13.3490 -9.8521 -4.6680 -4.2037
-5.9251 2.88 -1.6797 -2.1077
>> theta2=net{2}
theta2 =
-2.4762
0.5692
0.6694
输出:
out =
Columns 1 through 8
1.0000 000 0.0020 0.0000 1.0000 1.0000 0.0000 0.0000
1.0000 000 0.0041 1.0000 1.0000 1.0000 0000 1.0000
0.9991 0.0000 0.0036 0.0015 0.9992 0.9985 0.0055 0.0036
Comns 9 through 16
1.0000 0.0000 0.0019 1.0000 0.0000 0.0000 0.0000 0.9996
1.0000 1.0000 0.9901 1.0000 1.0000 1.0000 1.0000 0.0000
0.9977 0.9999 0.9996 0.9994 0.0046 0.0023 .0014 1.0000
Columns 17 throu 24
0.0020 0.9925 0.0020 0.0000 0.0020 1.0000 0.0002 1.0000
0041 0.0284 0.0041 0.0284 0.0041 1.00 0.9983 1.0000
0.0036 0.9955 0.0036 1.0000 0.0036 0.9989 0.9999 0.9990
Columns 25 through 32
1.0000 0.8 1.0000 0.0000 1.0000 0.9999 0.00 1.0000
1.0000 0.0177 0.000 0.0021 1.0000 0.0006 1.0000 1.00
0.0000 0.9971 0.0000 1.0000 0.0000 0.0004 0.9999 0.0000
Columns 33 through 40
0.9954 1.0000 0.0000 0.0000 0.9951 0.0020 0.0000 0.9997
0.0065 1.0000 1.0000 0.0025 0.0178 0.0041 1.0000 0.0000
0.9986 0.9990 0.999 1.0000 0.0101 0.0036 0.0013 1.000
Columns 41 through 48
0.0000 1.0000 0.998 0.0000 0.0020 1.0000 0.0000 0.987
0.0020 1.0000 0.000 0.0037 0.0041 1.0000 0.0328 0.0637
1.0000 0.0000 0.9999 1.0000 0.0036 0.9982 1.0000 0.9884
Columns 49 throh 56
0.0000 0.0001 1.0000 1.00 1.0000 0.0000 0.0004 1.0000
0.0164 0.9992 0.9982 1.0000 1.0000 1.0000 0.9965 0.9998
1.0000 0.9999 0.9948 0.9991 0.9989 0.0024 0.9998 0.9968
Cumns 57 through 64
1.0000 1.0000 0.0000 0.0020 0.0020 0.0001 0.0001 0.0000
9763 1.0000 0.0134 0.0041 0.0041 0.99 0.0395 0.0017
0.0202 .9988 1.0000 0.0036 0.0036 0.9999 0.9999 1.0000
Columns 65 through 70
.9993 0.0000 0.0000 0.9978 1.0000 0000
0.0000 0.0018 0.0110 0.0001 1.0000 0.9998
1.0000 1.0000 1.0000 0.9 0.9987 0.0007
每次结果因为初始化不同会不一样,可以选取一个性能比较好的网络
保持起来
save myBpNet net
save myShu.mat TestDataIn TestDataOut
测试数据也保存起来
(TestDataIn TestDataOut 为测试数据的输入向量和目标向量)
以后调用时
load myshu.mat
load myBpNet net
out=sim(net,TestDataIn)
基本框架程序:(前面的样本数据自己根据实际情况设计)
load('CSHuju1.t');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
0 1;
1 0 0;
0 1 1
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TtSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=ndperm(AllSamNum)
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t1:TrainSamNum)
TestDataIn=p(:,erPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},trainlm');
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)
用命令save filename net;保存网络,
调用时用命令load filename net;
增加网络的层数可以进一步降低误差,提高精度但会使网络复杂化 ,从而增加网络的训练时间 。精度的提高实际上也可过增加隐层神经 元的数目来获得 ,其效果更容易观察和掌握,所以应优先考虑 。
(2)初始值选取
为了使误差尽可能小 ,需要合理选择初始权重和偏置,如果太大就容易陷入饱和区,导致停顿 。一般应选为均匀分布的小数,介于 一1,1)。
(3)学习速率调整
学习速率的选取很重要 ,大了可能导致系统不稳定 ,小了会导致训练周期过长、收敛慢 ,达不到要求的误差 。一般倾向于选取较小的学习速率以保持系统稳定,通过观察误差下降曲线来判断 。下降较快说明学习率比较合适 ,若有较大振荡则说明学习率偏大。同时 ,由于网络规模大小的不同,学习率选择应当针对其进行调整 。
(4)期望
期望误差当然希望越小越好 ,但是也要有合适值。
在用MATLAB实现BP反向学习时需要不需要用deltalin()learnbp()sumsqr()这样的函数
本书制作版权属智能中国网,如果文章原创者认为我们侵犯了您的合法权益,请来信告知
deltalin() 、 learnbp() 是比较旧的版本函数.
如果不是做神经网络函数,直接应用newff,bptrain等工具箱函数就可以了.
小波神经网络就是小波分析理论与神经网络理论相结合的产物。从结构形式分有两大类:1、小波分析网络的松散型结合;2波分析与神经网络的嵌入式结合。前者是指彼此虽紧密结合但却又相对独立,采集到的信号先经过小波变换后输入到常规神经网络以完成分类、函数逼近等。后者是指将常规单隐层的神经网络的隐节点激励函数用小波函数代替,相应的输入到隐层的圈值及阈值分别由小波函数的伸缩因子和平移因子这也是我们通常所说的小波网络。
小波网络在训练的过程中同样采用普通BP算法,但是它对参数的初始化表现敏感,所以参始在小波网络的训练中也是很重要的。
请问与神经网络的其他分类方法,比如HammingMLP相比,SOM有什么优点?
1.快速性(无隐含层)2.无监督性3.可视化效果.