% P=[0.1 0.5;0.3 -0.2]; %输入矢量数据
% S1=2;S2=3;S3=5; %输入各层节点数
% [R,Q]=size(P);
% [W1,B1]=rands(S1,R); %给第一隐含层权值赋(-1,1)之间的随机数(错误)
% [W2,B2]=rands(S2,S1); %给第二隐含层权值赋(-1,1)之间的随机数(错误)
% [W3,B3]=rand(S3,S2); %给输出层权值赋(-1,1)之间的随机数
% B10=cat(2,B1,B1); %通过B10=[B1,B1]将S1*S1的B1矩阵合成为一个S1*Q的B1矩阵,以便进行下边的加法运算
% n1=W1*P+B10; %计算第一层加权输入和
% A1=hardlims(n1) %计算第一层输出表达式
% B20=cat(2,B2,B2); %通过B20=[B2,B2]将S2*S2的B2矩阵合成为一个S2*Q的B2矩阵,以便进行下边的加法运算
% n2=W2*P+B20; %计算第2层加权输入和
% A2=logsig(n2) %计算第2层输出表达式
% B30=cat(2,B3,B3); %通过B30=[B3,B3]将S3*S3的B3矩阵合成为一个S3*Q的B3矩阵,以便进行下边的加法运算
% n3=W3*P+B30; %计算第3层加权输入和
% A3=purelin(n3) %计算第3层输出表达式
%%%%%%%%%%%%%%
%%%rands()函数只有一个输出,要引用w1, B1, W2, ,B2, W3, B3等可以C用A(I)的形式,另外你有一个式子里矩阵相乘,其维数不一致不能相乘。
% P=[0.1 0.5;0.3 -0.2];
% S1=2;S2=3;S3=5;
% [r,Q]=size(P);
% A=rands(S1,r);
% D=rands(S2,S1);
% H=rands(S3,S2);
% B10=cat(2,A(2),A(2));
% n1=A(1)*P(1)+B10;
% A1=hardlims(n1)
% B20=cat(2,D(2),D(2));
% n2=D(1)*A1+B20;
% A2=logsig(n2)
% B30=cat(2,H(2),H(2));
% n3=H(1)*A2+B30;
% A3=purelin(n3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%人工神经网络设计者的三个主要任务:①网络类型②网络的结构③网络的参数(即网络的权值)
%感知器设计训练的步骤:
% ①确定输入的矢量P,目标矢量T,并由此确定各矢量的维数以及确定网络结构大小的神经元节点数目:r,s,q
% ②参数初始化:
% a.赋值给权矢量W在(-1,1)的随机非零初始值;
% b.给出最大训练循环次数;
%③网络表达式:根据输入的矢量P和最新权矢量W计算输出值A;
%④检查:检查输出矢量A和目标矢量T是否相同,如果是,或已达到最大循环次数,训练结束,否则转⑤
%⑤学习:根据感知器的学习规则调整权矢量,并返回⑤。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%例1简单分类问题
% P=[-0.5 -0.5 0.3 0;-0.5 0.5 -0.5 1];
% T=[1 1 0 0];
% [R,Q]=size(P);
% [S,Q]=size(T);
% W=rands(S,R);
% B=rands(S,1);
% max_epoch=20; %设置最大循环次数
% n=W*P+B;
% A=hardlim(n);
% for epoch=1:max_epoch
% if all(A==T)
% epoch=epoch-1;
% break
% end
% E=T-A;
% [dW,dB]=learnp([],P,[],[],[],[],E,[],[],[],[],[]);
% W=W+dW;
% B=B+dB;
% A=hardlim(n);
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%net.IW 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构。其值为Nl*Ni的细胞矩阵,Nl为网络层数(net.numLayers),Ni为输入向量数(net.numInputs)。通过访问net.IW{i,j},
%可以获得第i 个网络层来自第j 个输入向量的权值向量值。 所以一般情况下net,iw{1,1}就是输入层和隐含层之间的权值。
% P=[-0.5 -0.5 0.3 0;-0.5 0.5 -0.5 1];
% T=[1 1 0 0];
% net=newp(minmax(P),1)% net=newp(pr,s,tf,lf) pr表示R*2的矩阵,表示取输入矢量的最大值和最小值,s为输出的神经元的个数,tf为网络激活函数,缺省时为hardlim函数,lf为学习函数,缺省时为learnp函数
% A=sim(net,P);%训练前的网络输入 sim表示使用网络进行仿真
% net.trainparam.epochs=20;%定义最大循环次数 net.trainparam.epochs:最大迭代次数
% net=train(net,P,T);%训练网络使输入和输出相同 train表示训练一个网络,[ net, tr, Y1, E ]= train( net, X, Y )X:网络实际输入Y:网络应有输出tr:训练跟踪信息Y1:网络实际输出E:误差矩阵
% net.iw{1,1}%输出训练后的网络权值,net.iw 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构
% net.b{1} %输出训练后的网络偏差
% A=sim(net,P)%训练后的网络输出
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% P=[0.1 0.2 0.2 0.4 0.5 -0.6 0.7 0.8 -0.9 0.3;0.3 0.4 -0.5 0.4 -0.5 0.3 -0.7 0.7 -0.8 0.2];
% T=[1 1 0 0 1 1 0 1 0 0;0 0 1 1 1 1 0 0 0 1];
% [R,Q]=size(P);
% [S,Q]=size(T);
% W0=rands(S,R);
% B0=rands(S,1);
% net=newp(minmax(P),S)%建立感知器网络
% net.iw{1,1}=W0;
% net.b{1}=B0;
% net.trainparam.epochs=20;
% net=train(net,P,T);
% V=[-2 2 -2 2];%取一数组限定坐标数值大小空间
% plotpv(P,T,V);%在输入矢量绘画输入矢量和目标矢量的位置
% axis('equal');%另横坐标和纵坐标等距长度
% title('input vector graph');%写图标题
% xlabel('p1'),%横坐标标题
% ylabel('p2'),%纵坐标标题
% plotpc(net.iw{1,1},net.b{1})%绘制由W和B在输入平面中形成最终的分界线
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%感知器的局限性
%①感知器的激活函数采用阈值激活函数,输出矢量只能为1或0,只能解决简单的分类问题
%②感知器仅能将输入矢量线性的进行分类
%③当输入矢量中有一个远远大于或小于其他矢量,则收敛速度很慢
P=[-0.5 -0.5 0.3 0 -0.8;-0.5 0.5 -0.5 1 0];
T=[1 1 0 0 0];
V=[-2 2 -2 2];
net=newp(minmax(P),1,'hardlim','learnp')% net=newp(pr,s,tf,lf) pr表示R*2的矩阵,表示取输入矢量的最大值和最小值,s为输出的神经元的个数,tf为网络激活函数,缺省时为hardlim函数,lf为学习函数,缺省时为learnp函数
net.inputweights{1,1}.initfcn='rands';%赋输入权值的产生函数
net.biases{1}.initfcn='rands';%赋偏差的产生函数
net=init(net);%初始化网络
W0=net.iw{1,1}
B0=net.b{1}
A=sim(net,P);%训练前的网络输入 sim表示使用网络进行仿真
net.trainparam.epochs=40;%定义最大循环次数 net.trainparam.epochs:最大迭代次数
[net,tr]=train(net,P,T);%训练网络权值 train表示训练一个网络,[ net, tr, Y1, E ]= train( net, X, Y )X:网络实际输入Y:网络应有输出tr:训练跟踪信息Y1:网络实际输出E:误差矩阵
W=net.iw{1,1}%输出训练后的网络权值,net.iw 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构
B=net.b{1} %输出训练后的网络偏差
pause%看前面的网络训练结果图形,按任意键继续
plotpv(P,T,V);
hold on
plotpc(W0,B0);
plotpc(W,B);
hold off
fprintf('\n final network values:\n')
W
B
fprintf('trained for %.of epochs',max(tr.epoch));
fprintf('\nnetwork classifies:');
if all(hardlim(W*P+B)==T)
disp('correctly.')
else
disp('incorrectly.')
end