运行次数设定为40000次,在26886次收敛。结果达到预期效果!
function [ y ] = sigmod( x )
% 激励函数Sigmod,用于神经网络
y = 1/(1+exp(-x));
end
clc,clear
%samples
trainNumber=15;
testNumber=3;
trainData = [1.78,1.96,1.86,1.72,2.00,2.00,1.96,1.74,1.64,1.82,1.90,1.70,1.82,1.82,2.08;
1.14,1.18,1.20,1.24,1.26,1.28,1.30,1.36,1.38,1.38,1.38,1.40,1.48,1.54,1.56;
0.9,0.9,0.9,0.1,0.9,0.9,0.9,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1];%训练样本;
testData = [1.78,1.72,2;1.14,1.24,1.26;0.9,0.1,0.9];%测试数据;
hideSize=10;%隐含层神经元数目
outSize=1;%输出层神经元数目
inSize=2;%输入层神经元数目
Learning = 0.01;%学习率
W1=rand(hideSize,inSize);%输入层到隐含层之间的权重
W2=rand(outSize,hideSize);%隐含层到输出层之间的权重
B1=rand(hideSize,1);%隐含层神经元的阈值
B2=rand(outSize,1);%输出层神经元的阈值
Y = trainData(3,:);%期望输出
Falses=40000;%训练次数
E=zeros(1,Falses);
for False=1:Falses
for sample=1:trainNumber
x =trainData(1:2,sample);
hide_in=W1*x+B1;%影藏层输入值
hide_out = zeros(hideSize,1);%隐含层输出值
for j=1:hideSize
hide_out(j)=sigmod(hide_in(j));
end
y_in=W2*hide_out+B2;%输入层输入值
y_out = zeros(outSize,1);%输出层输出值
for j=1:outSize
y_out(j)=sigmod(y_in(j));
end
e=y_out-Y(:,sample);%输出层计算结果误差
E(False) = e(1);
%后向反馈
%隐含层与输出层之间的权重的变化量
dW2=zeros(outSize,hideSize);
for j=1:outSize%输出层
for k=1:hideSize%隐藏层
dW2(j,k)=Learning*e(j)*hide_out(k)*sigmod(y_in(j))*(1-sigmod(y_in(j)));%%隐藏层到输出层权值变化量
end
end
%隐含层阈值变化量
dB2 = zeros(outSize,1);%误差对输出层阈值求偏导,计算阈值变化量
for j=1:outSize
dB2(j)=Learning*e(j)*1*sigmod(y_in(j))*(1-sigmod(y_in(j)));
end
%输入层到隐含层的权重变化量
dW1 = zeros(hideSize,inSize);
for j=1:hideSize
for k=1:inSize
Sum = 0;
for m=1:outSize
Sum=Sum+e(m)*Learning*x(k)*sigmod(y_in(m))*(1-sigmod(y_in(m)))*sigmod(hide_in(j))*(1-sigmod(hide_in(j)))*W2(m,j);
end
dW1(j,k) = Sum;
end
end
%隐含层阈值变化量
dB1 = zeros(hideSize,1);
for j = 1:hideSize
Sum2 = 0;
for k = 1:outSize
Sum2 = Sum2 + sigmod(y_in(k))*(1-sigmod(y_in(k)))*W2(k,j)*sigmod(hide_in(j))*(1-sigmod(hide_in(j)))*e(k)*Learning;
end
dB1(j) = Sum2;
end
W1=W1-dW1;
W2=W2-dW2;
B1=B1-dB1;
B2=B2-dB2;
end
if mod(False,100)==0
False
end
if(E(False)<0.001)
False
break;
end
end
%检验数据结果
inspect_out = zeros(outSize,testNumber);
for i = 1:testNumber
x = testData(1:2,i);
hide_in = W1*x+B1;%隐含层输入值
hide_out = zeros(hideSize,1);%隐含层输出值
for j = 1:hideSize
hide_out(j) = sigmod(hide_in(j));
end
Y_in = W2*hide_out+B2;%输出层输入值
Y_out = zeros(outSize,1);
for j = 1:outSize
Y_out(j) = sigmod(Y_in(j));
end
inspect_out(:,i) = Y_out
end