|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
%-----BP神经网络方法—
0 K" t: O5 b+ M3 n& j. G; q% z%思路:将iris数据分为三类,训练数据和测试数据,用dividevec函数随机抽取,因此实验结果是不定的,最好情况是100%
5 U* f4 x: |. O9 Xclear all; x( k) x& N+ D A8 ^$ W' T
close all; K/ {, \0 a! Z1 ]
clc;
' W$ W7 F* y4 h7 c2 o+ V%% -------数据处理模块------------------, y q. m$ s( s4 N6 _
data=xlsread('iris.xlsx'); %此处的数据已经做了相应处理,因此xlsread 直接导入数据
) I( ~/ L( t3 Tdata1 = data(:,1:7); %data1指的是属性值
; r" P0 y! N% odata2 = data(:,end); %data2指的是分类
: w2 A( u% r8 }- V8 {. P, ]data2 = double(dec2bin(data2))-48; %函数名称:dec2bin 函数功能:把一个十进制数转换成一个字符串形式表示的二进制数。
9 E3 A+ A; J6 U6 g1 a1 [data = [data1,data2]; %处理后数据, D* g( L. \' D% U4 ^& e
[trainV,valV,testV] = dividevec(data1',data2',0.0,0.3) %将数据分为训练和测试两类,没有变量数据valV,因此所占百分比是0& }! n' }; w- Q/ S, d2 y
%dividevec()函数在 7.6 版本还可以使用,是把数据进行打乱,并分类为:训练输入数据、变量数据、测试数据的方法。0.5为测试数据百分比" H: Q r7 g! N0 j3 u9 k
%% -----------------数据归一化处理----------
7 w! G4 _. x" b, N0 @1 A7 b[input1,ps] = mapminmax(trainV.P,-1,1); %由于mapminmax是按行归一化,行表示属性 列表样本个数
: s' w. @' X3 H. w% @' X[input2,ps] = mapminmax(testV.P,-1,1);# Y8 K( F* I5 U$ v' @
%% -----------------构造输出矩阵----------- H: l* L. m9 @# S
output1 = trainV.T;
8 d& J/ q. J* f l: e# x0 Foutput2 = testV.T;
, E5 n& X# y( Q" s2 D1 D
3 D6 h) B' A# C. K%% ----- 建立网络--------------6 J. K4 D! P# [: V2 h
net = newff(input1,output1, [10 3]); %[10,3]表示有两层隐层,第一层隐层节点为10,第二层隐层节点为3
1 |0 i7 A3 v# ]%设置训练参数
( M5 {6 s5 _4 Z# lnet.trainParam.epochs=800; %训练次数7 i" E" [+ C- I ]+ X
net.trainParam.goal=0.005; %网络性能目标; y2 M% ]4 k, [3 R% H+ P! T ~ |+ @# {
net.trainParam.show=NaN; % 两次显示之间的训练次数,NaN表示不显示,默认是25.该参数的设置对程序没有影响。
w4 H! `3 n5 `& P! L% U& g; ~: |net.trainParam.lr=0.01; %学习训练速度
4 X" k# K6 H/ R/ ]: k" N8 O, k, w# j3 f5 P3 u" `
%% ----- 训练网络 --------------: S! G, o U& {7 N5 b
net = train(net,input1,output1);; L& D9 K+ V- Z, X9 N( y
%% ----- 仿真网络 --------------
3 l! E8 @7 Z- P# i' Voutput_fact = sim(net,input2); %注意sim仿真网络直接输出的并不是整数形式,而是很贴近整数的小数形式,因此要做相应的变化1 o: j d1 T* `0 [8 z; ?
output_fact(output_fact>=0.5) = 1;
& A% f4 \. C& ^ ~/ |7 Eoutput_fact(output_fact<0.5) = 0;
9 p: r, [& G& B& j; ^1 }" m) mN = length(testV.P);
: U/ y8 E/ }+ O: [) Q1 g4 coutput_class = sum(output_fact.*[ones(1,N)*2;ones(1,N)*1],1);
3 m2 g5 s7 u' [5 t& {7 z- {: t, Q5 Toutput2 = sum(output2.*[ones(1,N)*2;ones(1,N)*1],1); O% a4 I3 X8 y
correct_rate = sum(output_class == output2)/N;
0 z; H* d8 k2 Rsprintf('识别率是 %3.3f%%',correct_rate*100);" `' ?/ q2 x1 p! p
& r% C' _/ D0 W/ u' c
问题描述:
4 G' k" `1 M5 j+ Z5 L
+ e- D4 J4 J- m0 p( g上图为BP神经网络结构图,上述代码是想将数据分为3类,我想将这儿的输出层2个节点改为3个节点,该怎么修改?请教大神,非常感谢! |
|