• 大小: 2.29MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-10-11
  • 语言: Matlab
  • 标签: MATLAB  

资源简介

本代码(MATLAB)可直接运行,对Iris鸢尾花数据分类,准确率96%左右,随机2/3数据训练,1/3数据测试。对于新手有帮助,多为矩阵运算。

资源截图

代码片段和文件信息

clear 
clc
f=fopen(‘iris.data‘);
Iris=textscan(f‘%f%f%f%f%s‘‘delimiter‘‘‘);
fclose(f);
[~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}‘Iris-setosa‘)
        data(i5:7)=[1 0 0];
    elseif  strcmp(Iris{15}{i1} ‘Iris-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只能对行进行归一化
%%
%划分训练样本和测试样本 大约2/3用作训练,1/3用作测试
num=round(m/3/3);
for i=1:3
    temp=data(1+50*(i-1):50*i:);
    sel=randperm(50num);
    test(1+num*(i-1):num*i:)=temp(sel1:4);
    test_label(1+num*(i-1):num*i:)=temp(sel5:7);
    temp(sel:)=[];
    train(1+(50-num)*(i-1):(50-num)*i:)=temp(:1:4);
    train_label(1+(50-num)*(i-1):(50-num)*i:)=temp(:5:7);
end
%%
[mn]=size(train);
alpha=4;%输入神经元数目
beta=8;%隐层神经元数目
lamda=3;%输出神经元数目
rng(‘shuffle‘)
W1=rand(alphabeta);%输入层和隐层之间的权值矩阵
W2=rand(betalamda);%隐层和输出层间的权值矩阵
B1=rand(1beta);%隐层阈值矩阵
B2=rand(1lamda);%输出层阈值矩阵
B22=B2;
W11=W1;
Eta=1;%学习率
iter_max=10000;%最大迭代次数
iter=1;
%BP神经网络,每次仅针对一个训练样例更新连接权和阈值
while iter<=iter_max
   for i=1:m
    hidden_in=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-train_label(i:)).^2);%求平方和可用sumsqr函数
    %%
    %更新参数BP神经网络中最核心的部分
   g=output_out.*(1-output_out).*(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*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(testtest_labelW1W2B1B2);
disp(‘结果为:‘)
result‘
disp(strcat(‘准确率为‘num2str(accuracy*100)‘%‘))
function [resultaccuracy]=BP_test(testtest_labelW1W2B1B2)
%返回分类的结果
%accuracy准确率
Hidden_in=test*W1;%隐层输入
Hidden_out=sigmod(Hidden_in-B1);%隐层输出
Output_in=Hidden_out*W2;%输入层输入
Output_out=sigmod(Output_in-B2);
[~result]=max(Output_out[]2);
[~index2]=max(test_label[]2);
right=sum(result==index2);%统计分类正确的个数
total=size(test1);%总个数
accuracy=right/total;
end
%sigmod函数在matlab里是logsig函数
function [Y]=sigmod(X)
Y=1./(1+exp(-1).^X);
end
        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2909  2019-08-12 23:37  neural_networks\BP_networks.m
     文件        4551  2019-08-04 13:24  neural_networks\iris.data
     文件     1133510  2019-08-12 22:55  neural_networks\周志华-机器学习-101.jpg
     文件      632486  2019-08-12 22:56  neural_networks\周志华-机器学习-102.jpg
     文件      467382  2019-08-12 22:56  neural_networks\周志华-机器学习-103.jpg
     文件      839981  2019-08-12 22:56  neural_networks\周志华-机器学习-104.jpg
     目录           0  2019-08-12 23:40  neural_networks\

评论

共有 条评论