• 大小: 379KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: 其他
  • 标签: matlab  

资源简介

一个人工神经元网络是由一个多层神经元结构组成,每一层神经元拥有输入(它的输入是前一层神经元的输出)和输出,我们把神经元和与之对应的神经元之间的连线用生物学的名称,叫做突触,在数学模型中每个突触有一个加权数值,称做权重,此时第i层上的某个神经元所得到的输出等于每一个权重乘以第i-1层上对应的神经元的输出之和,最后再通过激活函数来对输出进行量化,在与阈值相比较判断是否属于某一类。

资源截图

代码片段和文件信息

clear
clc
load fisheriris;%导入数据
Iris={meas(:1)meas(:2)meas(:3)meas(:4)species};%cell
[~n]=size(Iris);
for i=1:n-1
data(:i)=Iris{1i};
end
[mn]=size(data);
for i=1:m
if strcmp(Iris{15}{i1}‘setosa‘)
data(i5:7)=[1 0 0];
elseif  strcmp(Iris{15}{i1} ‘versicolor‘)
data(i5:7)=[0 1 0];
else
data(i5:7)=[0 0 1];
end
end
%数据归一化处理[01]区间内
x_max=max(data);
x_min=min(data);
data=(data-ones(m1)*x_min)./(ones(m1)*(x_max-x_min));
% 这里可用函数data=mapminmax(data01)替换
%但data需要转置因为mapminmax只能对行进行归一化
%%
%K折
indices=crossvalind(‘Kfold‘data(1:1507)5);%进行随机分包
z1=0;z2=0;%计算平均准确率
alpha=4;%输入神经元数目
beta=10;%隐层神经元数目
lamda=3;%输出神经元数目
%%
s=rng;
rand(alphabeta);
rand(betalamda);
rand(1beta);
rand(1lamda);
rng(s);
%%保证每次运行生成的随机数相同
%训练
for k=1:1:5
%%%%%%%%%%%%%%%%%%%自定义%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
test1=(indices == k);%逻辑验证
train1=~test1;%逻辑验证
c_test=data(test11:4);
c_test_label=data(test15:7);
x_train=data(train11:4);
x_train_label=data(train15:7);
%%
[mn]=size(x_train);
%生成随机初始向量
W1=rand(alphabeta);%输入层和隐层之间的权值矩阵
W2=rand(betalamda);%隐层和输出层间的权值矩阵
B1=rand(1beta);%隐层阈值矩阵
B2=rand(1lamda);%输出层阈值矩阵
B22=B2;
W11=W1;
Eta=0.1;%学习率
iter_max=10000;%最大迭代次数
iter=1;
%BP神经网络,每次仅针对一个训练样例更新连接权和阈值
while iter<=iter_max
for i=1:m
hidden_in=x_train(i:)*W1;%隐层输入
hidden_out=sigmod(hidden_in-B1);%隐层输出
output_in=hidden_out*W2;%输出层输入
output_out=sigmod(output_in-B2);%输出层输出
%计算误差
E(i)=sum((output_out-x_train_label(i:)).^2);%求平方和也可用sumsqr函数
%%
%更新参数BP神经网络中最核心的部分
g=output_out.*(1-output_out).*(x_train_label(i:)-output_out);%计算输出层神经元的梯度项
e=hidden_out.*(1-hidden_out).*(g*W2‘);%计算隐层神经元的梯度项
Deta_W2=Eta*hidden_out‘*g;
Deta_B2=-Eta*g;
Deta_W1=Eta*x_train(i:)‘*e;
Deta_B1=-Eta*e;
W1=W1+Deta_W1;
W2=W2+Deta_W2;
B1=B1+Deta_B1;
B2=B2+Deta_B2;
end
%计算训练集的累积误差
E=mean(E);
if E<1e-4  %目标误差
iter
break
end
if mod(iter1000)==0
iter;
end
iter=iter+1;%更新迭代次数
end
%%
%测试
[resultaccuracy]=BP_test(c_testc_test_labelW1W2B1B2);
disp(strcat(‘第‘num2str(k)‘次自定义准确率为‘num2str(accuracy*100)‘%‘))
z1=z1+accuracy;
%%%%%%%%%%%%%%%%%%%自定义%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%调包%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net = newff( x_train‘ x_train_label‘ 10);
%设置训练参数
net.trainParam.showWindow = false;
net.trainParam.showCommandLine = false;
net.trainparam.epochs = 10000 ;%允许最大训练步数500步
net.trainparam.goal = 0.0001 ;%训练目标最小误差0.01
net.trainParam.lr = 0.1 ;%学习速率0.1
%开始训练
net = train( net x_train‘ x_train_label‘) ;
%测试
Y = sim(netc_test‘) ;
%统计识别正确率,列最大值所在位置对比
[max_Yindex1]=max(Y[]1);  %求最大值所在位置
[max_c_test_labelindex2]=max(c_test_label‘[]1);
a=0;
for i=1:1:30
if index1(i)==index2(i)
a=a+1;
end
end
r=a/30;
z2=z2+r;
disp(strcat(‘第‘num2str(k)‘次调包准确率为‘num2str(r*100)‘%‘))
%%%%%%%%%%%%%%%%%%%调包%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
disp(strcat(‘自定义平均准确率为‘num2str(z1/5*100)‘%‘))
disp(strcat(‘调包平均准确率为‘num2str(z2/5*100)‘%‘))

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3323  2020-07-02 15:57  bp_iris.m
     文件         411  2020-06-08 10:30  BP_test.m
     文件          58  2020-06-08 10:28  sigmod.m
     文件      392886  2020-07-05 12:27  神经网络iris.docx

评论

共有 条评论