神经网络入门教程

本书制作版权属智能中国网，如果文章原创者认为我们侵犯了您的合法权益，请来信告知

感谢书中文章所有原创作者奉献的精彩文章，如果文章原创者认为我们侵犯了您的合法权益，请来信告知，如果您对这个电子书有什么好的意见，请告知我们，如果您对神经网络matlab的某些问题有好的见解，也烦请告知我们。

我们一起努力，把这个完善

时间仓促，错误之处，编排不合理之处，在所难免，请大家谅解。

此份电子书里面总结了一些基本的matlab神经网络问题

献给需要学习matlab神经网络的朋友

学习没有捷径，有一句话，不走弯路就是捷径

希望我们的这份电子书能让您少走一点弯路

那么我们做这个书的目的意义也就达到了

本教程使用方法：

请选择本书中推荐的一些书籍，配合本教程进行学习。

我们在风雨中上路

我们不知道我们前面还会有多少坎坷

但我们一直在努力

有你有我

一切困难

无惧无畏

论坛何其多

群何其多

朋友何其多

但真正能当成家一样的论坛和群又有几个

真正知心的朋友又有几人

网络是虚拟的

但我们相信

感情是真挚的

我们一直为打造一个优秀的平台而努力

我们将与你一路同行

共同交流

共同分享

我们一直用我们的率直，诚恳，努力

影响一片人

带动一群人

欢迎加入智能中国网

智能中国网：http://www.5iai.com/bbs/

邮箱：service@5iai.com

制作：智能中国网

祝您阅读愉快


神经网络书籍

神经网络设计 此书通俗易懂，好书，推荐

神经网络模型及其matlab仿真程序设计 周开利

（对神经网络工具箱函数及里面神经网络工具箱的神经网络模型的网络对象及其属性做了详细的论述，后者在神经网络理论与matlab7实现那本书里面是没有的）

神经网络理论与matlab7实现

（这本书对初学这入门还是挺不错的，看过了，就对matlab神经网络工具箱有教好的了解）

神经网络设计（我认为这是一本很好的书，讲理论不是很多，看过之后就会对神经网络的原理有更好的了解）

神经网络结构设计的理论与方法（这本书对提高网络的泛化能力的一些方法做了讲述，并且书后有程序，对网络结构的设计应该是挺有帮助的）


神经网络学习初期提示：

第一步：看看入门书籍,对神经网络有个初步认识;
第二步：掌握如下算法:
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 M. Mitchell著，中英文都有）的第4章和《神经网络设计》（机械工业出版社，Martin T. Hargan等著，中英文都有）的第11章。
第三步：在掌握上述算法的基础上看各种前馈网络、反馈网络、联想存储器、神经网络集成、模糊神经网络等技术就属于学习神经网络的高级阶段了，需要根据自己的研究和应用方向决定。
神经网络高级话题：
神经网络研究的高级阶段是研究各种神经网络（包括多层感知器网络、径向基函数网络、概率神经网络、径向基概率神经网络、递归神经网络、光学神经网络、库仑能量网络、隐马尔科夫模型、模糊极大极小网络、模块神经网络、学习委员会机、ARTMAP网络、自适应共振理论(ART1-3)、自组织特征映射、联想记忆、主分量分析、独立分量分析、盲源分离、硬聚类和模糊聚类子空间理论、波尔兹曼机、神经认知机、统计学习理论、支撑矢量机、随机神经网络理论、EM算法、遗传与进化算法、增强学习理论、人工免疫算法、模拟退火算法）的数学理论、学习算法、模型和结构、推广能力、预测与逼近能力。
神经网络的应用领域：
神经网络在模式识别、图象处理、数据挖掘、机器人、生物信息学等领域被广泛应用。


我眼中的神经网络----给初学者

我觉得目前论坛里的新手很多，呵呵，问的问题很多都是重复的，首先希望你们能先找找时不时有人问过了，是不是有人已经回答过了。下面我把我的一点体会和看法说出来，可能有很多是不正确或者不深刻的，希望各位指出来，谢谢
1、我知道的目前一般的神经网络，尤其是前馈网络可以做的是两方面的问题：分类和函数拟合（包括预测）。当然，hopfield网络还具有联想记忆功能，可以做一些相关的事情。
2、我觉得神经网络还处于初期阶段，很多问题，尤其是规模大或者要求精度高的问题，还是解决不了的，不要总是怀疑自己是不是程序错了或者有什么问题之类的。（说实话，我觉得神经网络进入工程还有很长的路要走。做论文还可以，呵呵）
3、一般来说，前馈网络的样本都是要采取归一化的，原因是样本的数量级差太大的话会出现大样本吞吃小样本的现象，使得数量小的那一维样本不起作用。


人工神经网络的特点

人工神经网络的以下几个突出的优点使它近年来引起人们的极大关注：
(1)可以充分逼近任意复杂的非线性关系；
(2)所有定量或定性的信息都等势分布贮存于网络内的各神经元，故有很强的鲁棒性和容错性；
(3)采用并行分布处理方法，使得快速进行大量运算成为可能；
(4)可学习和自适应不知道或不确定的系统；
(5)能够同时处理定量、定性知识。

人工神经网络的特点和优越性，主要表现在三个方面：
第一，具有自学习功能。例如实现图像识别时，只在先把许多不同的图像样板和对应的应识别的结果输入人工神经网络，网络就 会通过自学习功能，慢慢学会识别类似的图像。自学习功能对于预测有特别重要的意义。预期未来的人工神经网络计算机将为人类提 供经济预测、市场预测、效益预测，其应用前途是很远大的。
第二，具有联想存储功能。用人工神经网络的反馈网络就可以实现这种联想。
第三，具有高速寻找优化解的能力。寻找一个复杂问题的优化解，往往需要很大的计算量，利用一个针对某问题而设计的反馈型 人工神经网络，发挥计算机的高速运算能力，可能很快找到优化解。


人工神经网络的主要方向

神经网络的研究可以分为理论研究和应用研究两大方面。
理论研究可分为以下两类：
1)．利用神经生理与认知科学研究人类思维以及智能机理。
2)．利用神经基础理论的研究成果，用数理方法探索功能更加完善、性能更加优越的神经网络模型，深入研究网络算法和性能， 如：稳定性、收敛性、容错性、鲁棒性等；开发新的网络数理理论，如：神经网络动力学、非线性神经场等。
应用研究可分为以下两类：
1)．神经网络的软件模拟和硬件实现的研究。
2)．神经网络在各个领域中应用的研究。这些领域主要包括：
模式识别、信号处理、知识工程、专家系统、优化组合、机器人控制等。 随着神经网络理论本身以及相关理论、相关技术的不断 发展，神经网络的应用定将更加深入。

34 如何选择训练集和测试集数据？
一般需要将样本分成独立的三部分训练集（train set），验证集（validation set)和测试集（test set）。其中训练集用来估计模型，验证集用来确定网络结构或者控制模型复杂程度的参数，而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50％，而其它各占25％，三部分都是从样本中随机抽取。
样本少的时候，上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱，然后均匀分成K份，轮流选择其中K－1份训练，剩余的一份做验证，计算预测误差平方和，最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的K取N，就是留一法（leave one out）。


神经网络的应用

我个人认为首先是对实际问题分析，看传统的方法行不行，如果行就用传统方法解决，如果传统方法解决的不理想，然后尝试用神经网络，神经网络用于求解问题是因为它具有“学习”能力，对于非线性、有噪、模式识别等问题有着得天独厚的优势，对于问题分析以后，重在选择相应的模型求解，尝试模型的求解过程同时也涉及到模型的优化等问题，最后编制程序运行。我个人认为选择什么样的模型求解实际问题是最关键的，用什么语言编程实现或者怎么实现好象都不是那么难。个人观点，欢迎补充。


神经网络的权值和阈值分别是个什么概念？

权值和阈值是神经元之间的连接，将数据输入计算出一个输出，然后与实际输出比较，误差反传，不断调整权值和阈值
假如p1=[1 1 -1]';
p2=[1 -1 -1]';
属于不同的类
须设计分类器将他们分开
这里用单层神经元感知器
初始权值 w=[0.2 0.2 0.3] b=-0.3
输出 a1 a2
a1=hardlims(w*p1+b)
a2=hardlims(w*p2+b)
如果不能分开，还须不断调整w,b
这里说明一下权值w 阈值b 而已
简单地说，阈值也可以看作一维权值，只不过它所对应的那一维样本永远是 -1（也有的书上说是 1），这样就把输入样本增加了一维，更有利于解决问题.


ann如何做预测的一个例子

%输入向量
p=[97 28 12 32 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 173 17 5 1 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 9 3
250 4 3 0 58 3;
61 30 12 35 6 2 0 1 11 7 5 9 11 17 2 3 22 2 4 3 5 5
4 2 0 16 5 12 4 237 11 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 14 3 249 20 3 0 56 3;
94 38 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 10 0
230 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 0 10 4 331 25 1 1 104 5;
106 55 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 7 1 529 50 7 1 141 0;
113 75 19 29 42 9 2 3 26 0 13 21 5 26 2 5 27 1 5 20 2 5 18 4 4 1 3 17 5 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 11 6 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 3 2 7 9 12 7
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 3 13 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 5 14 3 249 20 3 0 56 3;
94 38 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 10 0
230 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 0 10 4 331 25 1 1 104 5;
106 55 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 7 1 529 50 7 1 141 0;
113 75 19 29 42 9 2 3 26 0 13 21 5 26 2 5 27 1 5 20 2 5 18 4 4 1 3 17 5 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 11 6 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 3 2 7 9 12 7
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 3 13 3
23 3 785 30 7 5 207 10;
111 124 15 31 72 14 0 2 27 2 12 20 7 29 0 42 17 2 7 11 2 8 12 5 6 4 3
23 1 703 25 4 5 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 4 13 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; 0 1;
0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 0 1; 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');
%%%%%%%%%%19隐层数 隐层数的确定有几个经验公式，也可以用试算法
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(:,4) p(:,3)+p(:,4)+p(:,5)
p(:,4)+p(:,5)+p(:,6) p(:,5)+p(:,6)+p(:,7) p(:,6)+p(:,7)+p(:,8)
p(:,7)+p(:,8)+p(:,9) p(:,8)+p(:,9)+p(:,10) p(:,9)+p(:,10)+p(:,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(net,test);
%仿真预测

%反归一化
for i=1:35
predict(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=sum+u(i+1,10);
end
sum
predictsum
sumerror= predictsum-sum

%绘制预报曲线
x=[t(:,10)];
a=x-out;
for i=1:35
error=a* (max(u(i,:))-min(u(i,:)))+ min(u(i,:));
end
X=1:35;
figure(1);
plot(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、线性函数转换，表达式如下：
y=(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.9 0.1 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、postmnmx、tramnmx
2. restd、poststd、trastd
3. 自己编程
具体用那种方法就和你的具体问题有关了
（by happy）
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
pm=max(abs(p(i,:))); p(i,:)=p(i,:)/pm;
和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是按照梯度最大方向修正误差平方和的，网络自身算法就有一定的局限性。如果要保留现有的节点之间的值可以用
net.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之间。


隐层神经元数目如何确定

隐单元的数目与问题的要求、输入/输出单元的数目都有着直接关系，数目太多会导致学习时间过长、误差不一定最佳，也会导致容错性差、不能识别以前没有看到的样本，因此一定存在一个最佳的隐单元数。有三个公式可用于选择最佳隐层神经元时的参考经验公式（回复里面无法编辑公式，如有需要请查相关资料）。
还有一种途径：首先使隐单元的数目可变，或者放入足够多的隐单元，通过学习将那些不起作用的隐单元剔除，直到不可收缩为止。同样，也可以在开始时放入比较少的神经元，学习到一定次数后，如果不成功再增加隐单元的数目，直到达到比较合理的隐单元数目为止。（个人认为后面这种办法比经验公式可行，而且往往根据经验公式确定后还是需要通过后面的办法最后确定）


BP神经网络程序常见的一个出错

p=[1,15,25;2,15,25;3,15,25;4,15,25;1,15,25;2,5,25;2,7.5,25;2,10,25;2,15,25;];
t=[0.6169;0.7068;0.7998;0.9052;1.0881;3.4255;1.0509;0.8835;0.7068];
[pn,minp,maxp]=premnmx(p);
net=newff(minmax(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'。在使用工具箱进行网络训练时，要求训练样本的个体是列向量。


BP神经网络的M文件 如何转为simulink

help gensim
--- help for network/gensim.m ---

GENSIM Generate a SIMULINK block to simulate a neural network.

Syntax

gensim(net,st)


BP网络参数解释

net.trainParam.show = 50;
net.trainParam.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.trainParam.goal = 1e-5;//训练结束的目标


BP网络中隐层结点个数的确定

计算机学报 1998年 第21卷 第1期 高大启《有教师的线性基本函数前向三层神经网络结构研究》中给出了初步计算隐层接点个数，和进一步精确接点个数的方法！！！

Neural Networks 18(2005)1341--1347 《sTABILITY ANALYSIS OF A THREE-TERM BACKPROPAGATION ALGORITHM》中也有一些方法，请大家参考！！！

第一个文章请在这里下载：

http://www.2nsoft.cn/bbs/read.php?tid=269&fpage=2


关于BP网络优缺点的讨论

多层前向BP网络的优点：wgao
①网络实质上实现了一个从输入到输出的映射功能，而数学理论已证明它具有实现任何复杂非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题；
②网络能通过学习带正确答案的实例集自动提取“合理的”求解规则，即具有自学习能力；
③网络具有一定的推广、概括能力。

多层前向BP网络的问题：
①BP算法的学习速度很慢，其原因主要有：
a 由于BP算法本质上为梯度下降法，而它所要优化的目标函数又非常复杂，因此，必然会出现“锯齿形现象”，这使得BP算法低效；
b 存在麻痹现象，由于优化的目标函数很复杂，它必然会在神经元输出接近0或1的情况下，出现一些平坦区，在这些区域内，权值误差改变很小，使训练过程几乎停顿；
c 为了使网络执行BP算法，不能用传统的一维搜索法求每次迭代的步长，而必须把步长的更新规则预先赋予网络，这种方法将引起算法低效。
②网络训练失败的可能性较大，其原因有：
a 从数学角度看，BP算法为一种局部搜索的优化方法，但它要解决的问题为求解复杂非线性函数的全局极值，因此，算法很有可能陷入局部极值，使训练失败；
b 网络的逼近、推广能力同学习样本的典型性密切相关，而从问题中选取典型样本实例组成训练集是一个很困难的问题。
③难以解决应用问题的实例规模和网络规模间的矛盾。这涉及到网络容量的可能性与可行性的关系问题，即学习复杂性问题；
④网络结构的选择尚无一种统一而完整的理论指导，一般只能由经验选定。为此，有人称神经网络的结构选择为一种艺术。而网络的结构直接影响网络的逼近能力及推广性质。因此，应用中如何选择合适的网络结构是一个重要的问题；
⑤新加入的样本要影响已学习成功的网络，而且刻画每个输入样本的特征的数目也必须相同；
⑥网络的预测能力（也称泛化能力、推广能力）与训练能力（也称逼近能力、学习能力）的矛盾。一般情况下，训练能力差时，预测能力也差，并且一定程度上，随训练能力地提高，预测能力也提高。但这种趋势有一个极限，当达到此极限时，随训练能力的提高，预测能力反而下降，即出现所谓“过拟合”现象。此时，网络学习了过多的样本细节，而不能反映样本内含的规律。

出现了过拟合iamqsar
神经网络计算不能一味地追求训练误差最小，这样很容易出现过拟合
可以通过交互验证的方法寻找相对较优的网络结构，在原来的论坛中我发过一个Matlab的源程序。
我不喜欢神经网络的最大的原因是他的重现性很差，但我还是要用它来发文章，为了生计啊，有时候觉得这种行为有点不道德，但又无可奈何.

petroyb 在工程应用领域中，应用BP网络的好坏最关键的仍然是输入特征选择和训练样本集的准备，若样本集代表性差、矛盾样本多、数据归一化存在问题，那么，使用多复杂的综合算法、多精致的网络结构，建立起来的模型预测效果不会多好。若想取得实际有价值的应用效果，从最基础的数据整理工作做起吧，会少走弯路的。

cokie BPNN的一些问题是可以通过参数控制来改善的，譬如：
学习速率这个参数可以控制能量函数的步幅，并且如果设为自动调整的话，可
以在误差率经过快速下降后，将学习速率变慢，从而增加BPNN的稳定性。
惯性项这个参数则可以可以降低神经元权重变化的频率，且不会使整个网络在
回想的计算过程中，由于太快而至不稳定。

我觉得BPNN的最大问题在于最优拓扑结构的构造，有些可以根据输入层的变量
数来预估需要的神经元数量，但并非最好的结构，目前大部分使用遗传算法来
搜索最优结构。

只要BPNN结构优秀，一般20个输入函数以下的问题都能在50000次的学习以内
收敛到最低误差附近。

至于“过拟合”现象，只要能够实时检测误差率的变化就可以确定最佳的训练次
数，比如15000次左右的学习次数，如果你不观察，设成500000次学习，不仅
需要很长时间来跑，而且最后结果肯定令人大失所望。


如何查看BP神经网络训练后的权值和阈值

训练好的权值、阈值的输出方法是：
输入到隐层权值：w1=net.iw{1,1}
隐层阈值：theta1=net.b{1}
隐层到输出层权值：w2=net.lw{2,1};
输出层阈值：theta2=net.b{2}


如何选择训练集和测试集数据

一般需要将样本分成独立的三部分训练集（train set），验证集（validation set)和测试集（test set）。其中训练集用来估计模型，验证集用来确定网络结构或者控制模型复杂程度的参数，而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50％，而其它各占25％，三部分都是从样本中随机抽取。
样本少的时候，上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱，然后均匀分成K份，轮流选择其中K－1份训练，剩余的一份做验证，计算预测误差平方和，最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的K取N，就是留一法（leave one out）。


神经网络(BP)系列(1)关于样本的归一和反归一(初学者请看)

本书制作版权属 智能中国网 ，如果文章原创者认为我们侵犯了您的合法权益，请来信告知

这个系列主要针对使用matlab 神经网络工具箱，对一些初学者容易理解错误的地方进行解析。
我的解析也可能有理解不对的地方，希望大家批评指正．
这个系列主要针对使用matlab 神经网络工具箱，对一些初学者容易理解错误的地方进行解析。
1． 神经网络一列为一个样本，所以对于matlab 而言，要求输入和输出的列数必须一样的
经常有人问起的问题：
如
http://www.5iai.com/bbs/read.php?tid=5847&keyword=%C9%F1%BE%AD%CD%F8%C2%E7

Error using ==> network/train
Targets are incorrectly sized for 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 5754 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,:))-min(x(i,:)))
end
结果：
0.0089 0.0085 1.0000 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.0115 1.0000 0
0.0013 0.0047 1.0000 0
0.0140 0.0161 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 0.1184 0.3876 0.2907 0.2665 1.0000 0.1454

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 so
that the inputs and targets will fall in the
range [-1,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(net,pn,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 be used
to 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 之间 选取合适的变换就可以做到了


神经网络(BP)系列(2)(初学者系列)

这个系列主要针对使用matlab 神经网络工具箱，对一些初学者容易理解错误的地方进行解析。
神经网络每次结果不同解析
神经网络每次结果不同是因为初始化的权值和阈值是随机的
因为每次的结果不一样，才有可能找到比较理想的结果啊
找到比较好的结果后，用命令save filename net;保存网络，
可使预测的结果不会变化，调用时用命令load filename net;
取p_test=[ ];
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.3795 0.7031;1 0.7031 0.4241;0.7774 0.4241 0.9559;0.9559 0.5012 0.7052;...
0.8209 0.7052 0.4983;0.6011 0.4983 1;]';
t=[0 0.7378 0.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维的向量，输出为三维的向量。输入的数据具有不同的单位和量级，所以在输入在输入神经网络之前应该首先进行归一化处理，将样本数据归一到0 1之间。
样本总共有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:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,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=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)

训练结果：
TRAINLM, Epoch 0/1000, MSE 0.296308/0.0001, Gradient 83.9307/1e-010
TRAINLM, Epoch 20/1000, MSE 0.0224641/0.0001, Gradient 6.7605/1e-010
TRAINLM, Epoch 40/1000, MSE 0.00563627/0.0001, Gradient 3.27027/1e-010
TRAINLM, Epoch 60/1000, MSE 0.00348587/0.0001, Gradient 1.49868/1e-010
TRAINLM, Epoch 80/1000, MSE 0.00247714/0.0001, Gradient 0.459233/1e-010
TRAINLM, Epoch 100/1000, MSE 0.0018843/0.0001, Gradient 0.289155/1e-010
TRAINLM, Epoch 120/1000, MSE 0.00148204/0.0001, Gradient 0.392871/1e-010
TRAINLM, Epoch 140/1000, MSE 0.00119585/0.0001, Gradient 0.340864/1e-010
TRAINLM, Epoch 160/1000, MSE 0.000980448/0.0001, Gradient 0.391987/1e-010
TRAINLM, Epoch 180/1000, MSE 0.000779059/0.0001, Gradient 0.389835/1e-010
TRAINLM, Epoch 200/1000, MSE 0.000606974/0.0001, Gradient 0.310202/1e-010
TRAINLM, Epoch 220/1000, MSE 0.000388926/0.0001, Gradient 0.331632/1e-010
TRAINLM, Epoch 240/1000, MSE 0.000143563/0.0001, Gradient 0.0403953/1e-010
TRAINLM, Epoch 248/1000, MSE 9.87756e-005/0.0001, Gradient 0.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.2211 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 -5.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.7009
13.3490 -9.8521 -4.6680 -4.2037
-5.9251 2.9388 -1.6797 -2.1077
>> theta2=net.b{2}

theta2 =

-2.4762
0.5692
0.6694
输出：
out =

Columns 1 through 8

1.0000 1.0000 0.0020 0.0000 1.0000 1.0000 0.0000 0.0000
1.0000 0.0000 0.0041 1.0000 1.0000 1.0000 1.0000 1.0000
0.9991 0.0000 0.0036 0.0015 0.9992 0.9985 0.0055 0.0036

Columns 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 0.0014 1.0000

Columns 17 through 24

0.0020 0.9925 0.0020 0.0000 0.0020 1.0000 0.0002 1.0000
0.0041 0.0284 0.0041 0.0284 0.0041 1.0000 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.9938 1.0000 0.0000 1.0000 0.9999 0.0000 1.0000
1.0000 0.0177 0.0000 0.0021 1.0000 0.0006 1.0000 1.0000
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.9999 1.0000 0.0101 0.0036 0.0013 1.0000

Columns 41 through 48

0.0000 1.0000 0.9983 0.0000 0.0020 1.0000 0.0000 0.9873
0.0020 1.0000 0.0000 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 through 56

0.0000 0.0001 1.0000 1.0000 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

Columns 57 through 64

1.0000 1.0000 0.0000 0.0020 0.0020 0.0001 0.0001 0.0000
0.9763 1.0000 0.0134 0.0041 0.0041 0.9990 0.0395 0.0017
0.0202 0.9988 1.0000 0.0036 0.0036 0.9999 0.9999 1.0000

Columns 65 through 70

0.9993 0.0000 0.0000 0.9978 1.0000 1.0000
0.0000 0.0018 0.0110 0.0001 1.0000 0.9998
1.0000 1.0000 1.0000 0.9999 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.mat');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,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=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)


训练好的BP神经网络如何保存

用命令save filename net;保存网络，
调用时用命令load filename net;


用BP逼近非线性函数，如何提高训练精度

(1)调整网络结构
增加网络的层数可以进一步降低误差 ，提高精度但会使网络复杂化 ，从而增加网络的训练时间 。精度的提高实际上也可以通过增加隐层神经 元的数目来获得 ，其效果更容易观察和掌握 ，所以应优先考虑 。
(2)初始值选取
为了使误差尽可能小 ，需要合理选择初始权重和偏置，如果太大就容易陷入饱和区，导致停顿 。一般应选为均匀分布的小数，介于 (一1，1) 。
(3)学习速率调整
学习速率的选取很重要 ，大了可能导致系统不稳定 ，小了会导致训练周期过长、收敛慢 ，达不到要求的误差 。一般倾向于选取较小的学习 速率以保持系统稳定，通过观察误差下降曲线来判断 。下降较快说明学习率比较合适 ，若有较大振荡则说明学习率偏大。同时 ，由于网络规 模大小的不同，学习率选择应当针对其进行调整 。
(4)期望误差
期望误差当然希望越小越好 ，但是也要有合适值。


在用MATLAB实现BP反向学习时需要不需要用deltalin()learnbp() sumsqr()这样的函数

deltalin() 、 learnbp() 是比较旧的版本函数.
如果不是做神经网络函数,直接应用newff,bptrain等工具箱函数就可以了.


小波神经网络

小波神经网络就是小波分析理论与神经网络理论相结合的产物。从结构形式分有两大类：1、小波分析与神经网络的松散型结合；2、小波分析与神经网络的嵌入式结合。前者是指彼此虽紧密结合但却又相对独立，采集到的信号先经过小波变换后输入到常规神经网络以完成分类、函数逼近等。后者是指将常规单隐层的神经网络的隐节点激励函数用小波函数代替，相应的输入到隐层的圈值及阈值分别由小波函数的伸缩因子和平移因子代替，这也是我们通常所说的小波网络。

小波网络在训练的过程中同样采用普通BP算法，但是它对参数的初始化表现敏感，所以参数的初始在小波网络的训练中也是很重要的。


SOM的优点

请问与神经网络的其他分类方法，比如Hamming，MLP相比，SOM有什么优点？
１.快速性（无隐含层）２.无监督性３.可视化效果.


matlab 学习点滴

maltab 博大精深,记录一点在学习中的点点滴滴

在1——500中，找出能同时满足用3除余2，用5除余3，用7除余2的所有整数；
a=1:500;
b=a(find(rem(a,3)==2));
c=b(find(rem(b,5)==3));
d=c(find(rem(c,7)==2));
disp('在1——500中，找出能同时满足用3除余2，用5除余3，用7除余2的所有整数:')
disp(d)
在1——500中，找出能同时满足用3除余2，用5除余3，用7除余2的所有整数:
23 128 233 338 443

matlab上标标注
subplot(1,1,1);
x=0:0.1:2*pi;
y1=sin(x);
y2=exp(-x);
plot(x,y1,'--*',x,y2,':o');
xlabel('x=0 to 2\pi');
ylabel('values of sin(x) and e^{-x}');
title('function plots fo sin(x) and e^{-x}');
legend('sin(x)','e^{-x}');

请问在matlab里面怎么把一个三段的分段函数表示出来呢
f(x)=x-1 (x>1);f(x)=0 (abs(x)<1);f(x)=x+1 (x<-1)
1)x=[-10:1:10];
for i=1:21
f(i)=(x(i)-1)*(x(i)>1)+(x(i)+1)*(x(i)<-1);
end
plot(x,f,'r*')
2)x=[-10:10];
f=zeros(size(x));
a=x>1;
b=x<-1;
f(a)=x(a)-1;
f(b)=x(b)+1;
3)f(x)=(x-1).*(x>1)+0.*(abs(x)<1)+(x+1).*(x<-1)

Q1: 对于x = [0.1200 0.2400 0.3600 0.5800 0.6600 0.7400 0.8100 0.8700 0.9100 1.0000]'
随机产生一个数a = rand
怎么样把大于a的第一个x（i）选出来？
x = [0.1200 0.2400 0.3600 0.5800 0.6Q600 0.7400 0.8100 0.8700 0.9100 1.0000]'
a=rand;
k=find(x>a);
x(k(1))

Q2: 如何从列矩阵(n*1)中分段截取数据组成新的矩阵?比如用列矩阵a的前k个数据组成一个新的列矩阵b?中间k个呢?
b=a(1:k);
b=a(l:l+k); (l+k<=n)

Q3: [1，2，3，NaN，5，NaN，7，8，9，10]
如何将NaN以外的8个数加起来，然后求这8个数的平均数。
mean_a=mean(a(~isnan(a)))

Q4 matlab里面怎么将符号常数变为数值
syms x;x1=solve('x+1=2','x');
if double(x1)>1
x=1
else
x=0
end

Q5: MATLAB中用pie命令画饼图
function PlotPie
x=[1 2 3 4 5 6 7 8 9 10];
y=[40 50 60 70 80 90 100 110 120 130 ];
str1={'A','B','C','D','E','F','G','H','I','J'};
por=y./sum(y);
for i=1:length(por)
  str{i}=[str1{i},' ',num2str(100*por(i)),'%'];
end
pie(x,y,str)

Q6 非线性拟和y＝a*x^b+c的程序，求a,b,c.
function FitPaperData
format long
E1=rand(89,1);
E2=rand(89,1)+3;
F=inline('p(1).*x.^p(2)+p(3)','p','x');
[p,r,j]=nlinfit(E1,E2,F,[1,2,3]);
P
Q7 已知向量A=[1 7 6 3 2 9 8];B=[1 6 3 8] ;
如果我想把向量A中与向量B中相同的元素清除掉，例如最后得到C=[7 2 9]
应该怎么做
如果各个向量中均无重复元素，提供一个简便的方法
A=[1 7 6 3 2 9 8];
B=[1 6 3 8] ;
setdiff(A,B)

Q8 内联函数如何部分赋值传参
tic
a=rand(1,10);
for i=1:length(a)
ff=['x.^2+',num2str(a(i))];
f=inline(ff,'x');
d(i)=quadl(f,-1,1);
end
d
toc

Q13 我想写一个函数，输入参数是一个字符串比如是＂１６０＂，函数主要目的是完成数据存储，我现在的问题是存储文件时，文件命名的问题，比如我想把输入的参数作为文件名的一部分，比如希望输出的文件名为"temp１６０",这个该怎样实现啊，谢谢！！！
i = 160;
name = ['temp' , num2str(i), '.txt']; %假设你想把当前工作区的数据存储为temp１６０.txt；
eval('save(name)');

具体的请看eval save fopen fread fwrite fprintf等函数的帮助

[1，2，3，NaN，5，NaN，7，8，9，10]
如何将NaN以外的8个数加起来，然后求这8个数的平均数。
-----------------------------------------------------------------

>> a=[1 2 3 nan 5 nan 7 8 9 10];
>> b=a;
>> b(find(isnan(a)))=[]

b =

1 2 3 5 7 8 9 10

a=[1 2 3 nan 5 nan 7 8 9 10];
简洁些可以这样:
mean_a=mean(a(~isnan(a)))

我想知道如何把数组/矩阵各行元素逆序排列？
例如a=[1 2 3 4 5；11 12 13 14 15]，
如何把它的元素逆序排列变成a1=[5 4 3 2 1；15 14 13 12 11]
----------------------------------------------------------------------------
FLIPLR Flip matrix in left/right direction.
FLIPLR(X) returns X with row preserved and columns flipped
in the left/right direction.

X = 1 2 3 becomes 3 2 1
4 5 6 6 5 4

See also FLIPUD, ROT90, FLIPDIM.

那位仁兄知道net=init（net）与rand('state',0)对于初始化网络有什么区别？
--------------------------------------------------------------------------------------
rand('state',0)这个固定了一个随机值，每次结果运行就一样了
net=init（net）每次运行的结果是不一样的

比如说一个2*100的矩阵A，只有A[1][90]这个元素是非零的，请问各位大虾有什么简洁方法输入吗？
------------------------------------------------------------------------------------------------------------
提供两个方法供参考
1 :
>> is=[1];
>> js=[90];
>> as=[100];
>> S=sparse(is,js,as)

S =

(1,90) 100
2:
>> S=spalloc(2,100,1);%2*100 matric with 1 nezeros elment
>> S(1,90)=100;
>> S
S =

(1,90) 100

求助：这段代码怎么简化一下？？

[No,Ns]=size(t);
[No,Ns]=size(y);
for i=1:No
sum_te=0;
for j= 1:Ns
sum_te=sum_te+abs((t(i,j)-y(i,j))/t(i,j)*100);% 序列t和y的相对误差绝对值之和
end
err(i)=sum_te/Ns;%
平均相对误差绝对值
end
---------------------------------------------------------------
[No,Ns]=size(t);
sa=sum(abs((t-y)./t*100),2);
sb=sa./Ns;

在画图时
使用hold on 可以保持上一幅图 当前图可以画在同一个轴上，而不覆盖。
如果不使用hold on 则新图会把旧图覆盖
参见 help hold on

bmpread:从磁盘中读bmp文件
gifread:从磁盘中读gif文件
tiffread:从磁盘中读tiff文件
pcxread:从磁盘中读pcx文件
这是图像处理工具箱中的几个函数

如何用语句实现matlab图形窗口的最大化
h = figure;
set(gcf,'outerposition',get(0,'screensize'));

图中加注文本(Add text in the figure)
text(x,y,’字符串’)
例：在上图中加语句。
t=0:pi/100:2*pi;
y=sin(t);
plot(t,y)
axis([0 2*pi,-1 1])
xlabel('0 \leq \itt \rm \leq \pi','FontSize',16)
ylabel('sin(t)','FontSize',20)
title('正弦函数图形','FontName','隶书','FontSize',20)
text(3*pi/4,sin(3*pi/4),'\leftarrowsin(t)=0.707', 'FontSize',16)
text(pi,sin(pi),'\leftarrowsin(t)=0', 'FontSize',16)
text(5*pi/4,sin(5*pi/4),'sin(t)=-0.707\rightarrow','FontSize',16, ...
'HorizontalAlignment','right')
句中：
leftarrow 表示加一个向左的箭头
rightarrow表示加一个向右的箭头
HorizontalAlignment 表示右对齐水平排列
gtext函数用于在图形窗口上用鼠标直接在指定的位置上加注文本，调用格式：gtext(‘字符串‘)
例：
t=0:pi/100:2*pi;
y=sin(t);
plot(t,y)
axis([0 2*pi,-1 1])
xlabel('0 \leq \itt \rm \leq \pi','FontSize',16)
ylabel('sin(t)','FontSize',20)
title('正弦函数图形','FontName','隶书','FontSize',20)
gtext('MATLAB')

在标题中指定TeX字符
t=0:pi/100:2*pi;
alpha=-0.8;
beta=15;
y=sin(beta*t).*exp(alpha*t);
plot(t,y)
title('{\itAe}^{-\it\alpha\itt}sin\it\beta{\itt}\it\alpha<<\it\beta')
xlabel('时间\mus.'),
ylabel('幅值')
在title中的字符串表现的是 Aeαt sinβt α<<β
{\itAe}^{-\it\alpha\itt}
sin\it\beta{\itt}\it\alpha<<\it\beta’
斜体Ae 上标斜体αt   斜体βt   斜体α
  斜体β

maltab中计算程序运行时间
tic

toc

写m文件时容易犯得错误一二
1.用数字来命名m文件

这点我曾经犯过,明明m文件里面我们得函数名有.
在command window里面打函数名不运行.后来才发现m文件得文件名竟然给我弄成数字了(为了省事,呵呵)
matlab不支持数字命名得m文件.

2.文件名和m函数名不一致

当文件名和函数名不一致时候,matlab默认文件名是唯一得.所以按文件名来调用运行
所以最好一致,不然写大得程序时候,涉及很多m文件,容易搞错.

3.老忘了在语句后面加分号
matlab在运行m文件时候,这样就会不停在command window里面输出没有加分号语句得值
,造成运行速度非常慢.

4.喜欢用数组和单变量
其实matlab强项在矩阵,所以尽量用矩阵变量.矩阵函数.
像repmat,reshape,等矩阵操作函数很好用得

我加几句matlab的.m文件保存的命名规则
1.文件名命名要用英文字符，第一个字符不能是数字
2.文件名不要取为matlab的一个固有函数,m文件名的命名尽量不要是简单的英文单词，最好是由大小写英文/数字/下划线等组成。原因是简单的单词命名容易与matlab内部函数名同名，结果会出现一些莫名其妙的错误。
3、文件存储路径最好为英文
4、m文件起名不能为两个单词，random walk，应该写成random_walk

若想一行输出20个数，fprinft输出格式
fprintf(fid_out,'%4d。。。%d4',A); 省略号里我得写20个%d吗
---------------------------------------
str=['']
for i=1:8
str=[str,'%10.3f ']
end
str=[str '\n']

nargin, nargout
Purpose
Number of function arguments.

Synopsis
n = nargin
n = nargout

Description
In the body of a function M-file, nargin and nargout indicate how many input or output arguments, respectively, a user has supplied.
nargin returns the number of input arguments specified for a function.

nargout returns the number of output arguments specified for a function.

Examples
This example shows portions of the code for the function fplot, which has an optional number of input and output arguments:

function [x0,y0] = fplot(fname,lims,npts,angl,subdiv)
%FPLOT Plot a function.
% FPLOT(fname,lims,npts,angl,subdiv)

% The first two input arguments are
% required; the other three have default values.
...
% [x,y] = fplot(...) returns x and y instead
% of plotting them.
...
if nargin < 5, subdiv = 20; end
if nargin < 4, angl = 10; end
if nargin < 3, npts = 25; end
...
if nargout == 0
plot(x,y)
else
x0 = x;
y0 = y;
end

nargin用法示例。
函数文件examp.m：
function fout=charray(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
命令文件mydemo.m：
x=[1:3];
y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)


写给matlab新手的几句话

matlab博大精深，说到底我也只不过是个初学者，只是学的时间比新手长了一点，现在写几句给新手，希望能给你们有点帮助
1 学Matlab并不难难的是学会怎么用。
2不要试图掌握matlab的每一个功能，熟悉和你专业最相关的部分就可以了。
3 不要问：明天要交作业了，哪位大侠帮忙写个程序吧，或初学matlab，不懂呀，大哥大姐帮忙写个程序之类的话
不要等到要用到才去学，如果你有兴趣，你有时间，你可以多学些东西，说不定什么时候就用了，机会只偏爱那些有准备的头脑，到时候就不会说什么，要做东西想让人指点，基础的东西来不及仔细看了，一写程序吗，低级错误满天飞
4 不要说：不要让我看matlab英文的帮助我看不懂--谁都是从不懂到懂的
5 不要担心：我编程能力差，我一定用不好matlab。
6 不要只问不学
7 学maltab要有耐心
8 看到某本书中或论坛的帖子中解决问题的方法要试着解决类似的问题，要举一反三，要学会变通
9 有了问题先自己想，察看帮助，1个小时后没有结果再问别人 ，不要一有问题就发问，然后什么都不管了，把希望寄托在别人身上
10 学会用搜索引擎，在网上可以找到很多资料，有的问题一搜索就能找到的，就不要来问别人了
11要多动脑，多动手写程序、调试，看程序时候多想几个为什么，理解别人程序中精华的东西，多自己调调程序，可以改改程序，把知识转成自己的，弄懂一两个经典例子比粗粗的看一大书要好，值得一提是不是一下子就能看懂相对比较长，比较复杂的程序的，要做的是自己慢慢去分析，利用已经有的资料和帮助，等慢慢搞懂它，要多看几遍，相信多看一遍你就会有一些新的认识，一直到你已经掌握里例子的精华。
12 多读matlab高手写的程序，帖子，找到一个高手，在几个大的论坛可以搜索出一大堆的帖子，然后慢慢去看吧，从中可以学到很多东西,也许你会发现很多你都看不懂，这很正常，别人写程序考虑的是能实现这样的功能，运行效率等问题，而不是考虑是不是很容易能让别人理解，你就看你现在能看懂，再看些通过你断点调试，查help能看明白的，看不懂的就先放下，遇到好的和看不懂，你又很挺感兴趣的话题，你先收藏起来，过段时间你再回头看看，你会发现，每看一遍，你就会多懂一些东西，当你第三遍甚至第四遍看同一个程序的时候，也许你就会有豁然开朗的感觉。一个比较长的程序，首先不要怕长，把它分解成一句一句，一句一句看懂它。要明白一口吃不成胖子，好东西要慢慢体会，才能领会。
13 电脑上复制粘贴很方便，对于别人解决的你专业上的问题，最好自己写一遍，这样印象深刻，对于不懂的函数用法的函数，help中查查，能看懂多少算多少，对于程序断点调试一遍，弄清楚每个语句的功能，
14 尽量摆脱c编程的习惯，总爱用循环，能不用的循环的尽量不用，掌握矢量化的精髓
15 善于总结，学习过的知识，看过好的帖子可以收藏起来，过段时间再复习一下，一段时间的积累，你会发现你的水平在慢慢提高
16 多用help，see also lookfor get,set 等常用命令
17 要大胆的去试，试过才知道可不可以，如有人问可不可以把多个子程序放在一个m文件中，呵呵，试试不就知道了
18 多参与讨论，不要只关心自己的问题，也经常关注别人的帖子，从中也可以学到不少东西的
19 提醒一句，不要做只会下资料而不看的收藏家，这样对你没什么意义，书不在于多，真的看一两本书也就够了，以后要用的时候，再去查书，一味的东看看西看看，见了别人的资料，不关好不好，就留信箱的人，我感觉也不该这样，有了那么多资料，就别想着还有没有比这更好的了
感觉语言是相通的，不一定只针对matlab这门语言
如何写程序，如果你还是初学者，那么尽量不要复制粘贴，那样你是永远也无法学会写程序的。另外也不要对着别人的程序，一个字一个字敲进去，那样的话你只能成为一名优秀的打字员。一个比较好的方法是先读懂他，理清他的思路，然后自己动手写，写不出来的时间再看看别人的程序，然后对照的看，你的和他的程序差异在哪里，写的过程就是提高的过程。

程序运行有错误怎么办，好多错误。首先，别害怕错误，这是每一个人都会碰到的问题，大牛，小虾都一样，你对你自己说 这不机会又来了，调程序的过程就是提高的过程。不要一遇到错误就来论坛发问了，如何调，关键是看错误提示，看错误的类型及出现在哪条语句上。
好好练自己的调试能力，这不仅可以帮你找到一些错误，有是碰到一些读不懂的程序，借助断点调试可以帮你读懂程序
还不行怎么办，用搜索引擎找答案（有时候把错误提示输进去就可以找到答案了）
还不行，这才发贴和别人交流
。。。。

写程序原则 尽量写的简单 通俗容易懂，让那些不如你聪明的人都能看懂，命名的时候做到见名知意，写的时间多加点注释，不然，不要说别人读不懂你的程序，等过几天，你自己也读不懂了，可以看看matlab里的函数，注释也写的很详细，当你觉得有些方法比较常用的时候，你可以封装成函数，加上一些说明，以后要用的时候，直接调用就可以了，注重代码的重用性。

勿在浮砂筑高台，基础很重要，为什么学matlab ，如果你只是把它当成 c c++的附属品，用这些语言的思维来写一些奇怪的类matlab程序，我想你还是直接用c 或 c ++更合适，不要一开始就想着用matlab 做出什么东西，好好看一本matlab的基础书，这些基础对你以后的进阶会很有帮助。再说混合编程，什么都不懂就想着去混合编程是不实际的，maltab版本 vs 的版本不同，都会对混合编程影响的。
所以结果是对着别人的例子来做也不一定会做出来，一是别人讲的有些细节问题没讲清楚，二是版本问题。就算做出来，如果不明白为什么要这样做，又有多大意义呢。然后自己做一个，又不会了。
说这些的目的无非是希望想做混合编程的朋友多了解一些基础的东西，否则在混合编程这一块上会浪费很多时间，结果还是没有解决问题。。


Easy CHM - http://www.eTextWizard.com

您现在使用的CHM文件由Easy CHM的未注册版本制作.
注册版本不会在CHM里自动添加此页面

Easy CHM 软件 软件出品: 国华软件 中国北京 |  | 截屏图片
 | 文件大小: 2989k - 2.84MB | 软件类型: 共享软件 购买注册: 这里
关键词: make chm, create chm, chm制作工具, chm电子书制作工具,chm帮助文件制作工具

描述:

Easy CHM是国华软件推出的一款强大的CHM电子书或CHM帮助文件的快速制作工具。使用EasyCHM只需要三个步骤就可以完成CHM的制作：1、用户指定一个目录，EasyCHM会自动导入全部目录及文件；2、设置CHM编译选项；3、开始制作。EasyCHM非常适合个人和单位制作高压缩比的带有全文检索及高亮显示搜索结果的网页集锦、CHM帮助文件、产品说明、公司介绍、CHM电子书等等。

主要功能：

  • 全自动的目录及文件导入（可以包括子目录）；
  • EasyCHM支持导入任意的文件类型；
  • EasyCHM操作速度快，性能稳定，EasyCHM因为上手容易深得广大用户好评；
  • EasyCHM自动生成CHM的目录列表并自动生成所有目录项；
  • 为CHM的目录列表自动添加多级编号；
  • 在编辑目录项、索引项时用到的移动、拖拽、替换等操作中Easy CHM完全支持多选操作，避免了一项一项地操作，极大的减少用户手工 － 非常适合企业维护CHM帮助文档；
  • 支持批量查找替换多级目录各项的标题文字内容；
  • 允许用户指定从文本文件的第N行自动截取标题；
  • 易用的目录编辑器；
  • 丰富实用的CHM制作选项帮助用户制作更加个性化的专业CHM电子书或CHM帮助文件；
  • EasyCHM自动生成输出Alias和Map头文件；
  • EasyCHM自动生成上下文相关的帮助文件（ContextID），适合于制作专业的支持Help Context ID的专业帮助文件；
  • EasyCHM可以保存工程文件，方便企业用户编辑维护文档。
  • 批量更换CHM目录各项的图标；
  • 内嵌CHM反编译工具；

EasyCHM未注册版本的主要限制：

  1. EasyCHM的未注册版本可以制作带任意层级目录的CHM，但是每个CHM的工具栏上都会自动添加一个ABOUT按钮，以提醒用户注册。注册版本不会添加ABOUT按钮。
  2. EasyCHM的未注册版本无法保存CHM的通用工程文件，如*.HHP、*.HHC、*.HHK等，未注册版本的EasyCHM会自动删除*.HHP、*.HHC、*.HHK这几个文件。

注册版本无任何限制。
如果EasyCHM可以为您的工作和学习提供帮助，请注册购买，感谢您给予软件作者的支持。
联系方式:
国华软件站点一: http://www.etextwizard.com
国华软件站点二: http://www.zipghost.com
技术支持信箱: webmaster@etextwizard.com
购买方式:
在线购买:（可提供发票，支持很多种支付方式，包括邮政汇款）
单用户企业版 299元 人民币 ：通过“共享软件注册中心”购买

单用户家庭版 99元 人民币： 通过“共享软件注册中心”购买
直接向作者注册（共3种方式）：
1、招商银行划款:
开户行： 招商银行北京分行双榆树支行
帐 号： 001015570093
户 名： 冯国华
2、中国农业银行金穗卡转帐（注意是卡号）：
金穗卡卡号： 95599 8001 42061 34216
收 款 人： 冯国华
3、中国工商银行牡丹灵通卡转帐：

开户城市：北京
牡丹灵通卡卡号：9558 8202 0000 3186295 （注意是卡号9558820200003186295）
收 款 人： 冯国华

注意事项：
直接向作者注册的用户请在汇出足额的注册费后以EMAIL形式通知作者，同时请尽量提供

  • 汇款日期

  • 汇出城市

  • 您汇到作者哪个帐号？

  • 汇款人姓名

  • 用于接收注册码的信箱（请确保可以接收邮件，最好多提供）

  • 您希望的注册用户名

  • 要注册的软件及套数

您提供的资料详细些会比较方便确认。
作者在确认支付已完成后将会马上发出注册码。
用户在收到注册信后请尽量给软件作者发个类似“已收到注册码”的确认信 - 感谢您的配合！
下载地址:

系统需求: Win98,WinME,WinXP,Windows2000,WinVista
安装支持: 支持安装及卸载