|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
%-----BP神经网络方法—9 c. X O% [1 i( u
%思路:将iris数据分为三类,训练数据和测试数据,用dividevec函数随机抽取,因此实验结果是不定的,最好情况是100%
+ i+ _- [: S: c* Yclear all;
- K* l( X1 c* \% Dclose all;1 D! v8 l9 P* N3 f- J
clc;, r. ?" [9 E% p( x
%% -------数据处理模块------------------
" d2 W4 ]( W6 M- A2 X" q+ u" T& ?data=xlsread('iris.xlsx'); %此处的数据已经做了相应处理,因此xlsread 直接导入数据9 j2 O; I: \7 v/ v
data1 = data(:,1:7); %data1指的是属性值
( V5 w' a! b% f" r6 b; Hdata2 = data(:,end); %data2指的是分类5 v) a$ D8 _, {; F/ D
data2 = double(dec2bin(data2))-48; %函数名称:dec2bin 函数功能:把一个十进制数转换成一个字符串形式表示的二进制数。
' W9 t2 A% e$ s9 ^6 p( Ddata = [data1,data2]; %处理后数据
0 f$ [, M2 j" ^1 c \) Q[trainV,valV,testV] = dividevec(data1',data2',0.0,0.3) %将数据分为训练和测试两类,没有变量数据valV,因此所占百分比是0! C+ u( n ] ~/ y ?9 Z* J% I: T
%dividevec()函数在 7.6 版本还可以使用,是把数据进行打乱,并分类为:训练输入数据、变量数据、测试数据的方法。0.5为测试数据百分比 |% d+ t, P8 ~. |2 Z: A! E
%% -----------------数据归一化处理----------
# [% ?! P9 V5 b% }4 l; ?2 u[input1,ps] = mapminmax(trainV.P,-1,1); %由于mapminmax是按行归一化,行表示属性 列表样本个数. S+ h' T+ R( `
[input2,ps] = mapminmax(testV.P,-1,1);, u0 ~3 t& a, r/ H: V
%% -----------------构造输出矩阵----------
9 V8 {2 t" A e0 Goutput1 = trainV.T;/ j" x& z& T1 W% [, i; g/ u
output2 = testV.T;! E/ k! m0 E* ?% G0 _ l
1 R& {* z2 m" J# }% o+ j/ a%% ----- 建立网络--------------7 n4 g* X b* B' \$ m9 N; u9 z& I
net = newff(input1,output1, [10 3]); %[10,3]表示有两层隐层,第一层隐层节点为10,第二层隐层节点为3
, ^/ u o1 G3 _' r2 `, K$ A%设置训练参数% z6 B( o" |& e; X2 [
net.trainParam.epochs=800; %训练次数; G* t9 ]; {" D, `. {2 ]4 [
net.trainParam.goal=0.005; %网络性能目标
7 T ~7 z5 F& x* bnet.trainParam.show=NaN; % 两次显示之间的训练次数,NaN表示不显示,默认是25.该参数的设置对程序没有影响。
, q L" T U9 xnet.trainParam.lr=0.01; %学习训练速度: Q9 j+ X5 b" u3 N0 [( P0 x
+ r: h# `; }8 i% z+ v4 b%% ----- 训练网络 --------------$ I3 K3 M8 D0 I% e
net = train(net,input1,output1);# `9 p; `7 Y% q- D
%% ----- 仿真网络 --------------7 @- g" q6 Q0 E% }( H: { B" x1 M
output_fact = sim(net,input2); %注意sim仿真网络直接输出的并不是整数形式,而是很贴近整数的小数形式,因此要做相应的变化
% |9 U3 R4 F) s# R% |, Q3 K/ R/ zoutput_fact(output_fact>=0.5) = 1;
/ f6 D1 J: D( V2 v: [output_fact(output_fact<0.5) = 0;) k7 i$ t/ p# _" Z6 P3 t; X0 x0 b' L
N = length(testV.P);# Q" \6 Z8 p, R3 U6 Z
output_class = sum(output_fact.*[ones(1,N)*2;ones(1,N)*1],1);
% E* Z; M) g9 l" K4 ~: l; Youtput2 = sum(output2.*[ones(1,N)*2;ones(1,N)*1],1);
; m7 n* g* |1 N9 vcorrect_rate = sum(output_class == output2)/N;
3 V( u1 f9 \: z1 U3 f' X# [sprintf('识别率是 %3.3f%%',correct_rate*100);* [% r! j5 S: ]
, j7 Q; r3 V0 K: A7 U, L
问题描述:- c' v1 j1 H0 {* [3 D6 n4 s
; D" A5 U$ M4 N* Y6 I# {3 ?上图为BP神经网络结构图,上述代码是想将数据分为3类,我想将这儿的输出层2个节点改为3个节点,该怎么修改?请教大神,非常感谢! |
|