資源簡介
本代碼(MATLAB)可直接運(yùn)行,對Iris鳶尾花數(shù)據(jù)分類,準(zhǔn)確率96%左右,隨機(jī)2/3數(shù)據(jù)訓(xùn)練,1/3數(shù)據(jù)測試。對于新手有幫助,多為矩陣運(yùn)算。

代碼片段和文件信息
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
%數(shù)據(jù)歸一化處理[01]區(qū)間內(nèi)
x_max=max(data);
x_min=min(data);
data=(data-ones(m1)*x_min)./(ones(m1)*(x_max-x_min));
%?這里可用函數(shù)data=mapminmax(data01)替換
%但data需要轉(zhuǎn)置因?yàn)閙apminmax只能對行進(jìn)行歸一化
%%
%劃分訓(xùn)練樣本和測試樣本?大約2/3用作訓(xùn)練,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;%輸入神經(jīng)元數(shù)目
beta=8;%隱層神經(jīng)元數(shù)目
lamda=3;%輸出神經(jīng)元數(shù)目
rng(‘shuffle‘)
W1=rand(alphabeta);%輸入層和隱層之間的權(quán)值矩陣
W2=rand(betalamda);%隱層和輸出層間的權(quán)值矩陣
B1=rand(1beta);%隱層閾值矩陣
B2=rand(1lamda);%輸出層閾值矩陣
B22=B2;
W11=W1;
Eta=1;%學(xué)習(xí)率
iter_max=10000;%最大迭代次數(shù)
iter=1;
%BP神經(jīng)網(wǎng)絡(luò),每次僅針對一個(gè)訓(xùn)練樣例更新連接權(quán)和閾值
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);%輸出層輸出
????%計(jì)算誤差
????E(i)=sum((output_out-train_label(i:)).^2);%求平方和可用sumsqr函數(shù)
????%%
????%更新參數(shù)BP神經(jīng)網(wǎng)絡(luò)中最核心的部分
???g=output_out.*(1-output_out).*(train_label(i:)-output_out);%計(jì)算輸出層神經(jīng)元的梯度項(xiàng)
???e=hidden_out.*(1-hidden_out).*(g*W2‘);%計(jì)算隱層神經(jīng)元的梯度項(xiàng)
???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
%計(jì)算訓(xùn)練集的累積誤差
E=mean(E);
if?E<1e-4??%目標(biāo)誤差
????iter
????break
end
if?mod(iter1000)==0
???????iter
end
???iter=iter+1;%更新迭代次數(shù)
end
%%
%測試
[resultaccuracy]=BP_test(testtest_labelW1W2B1B2);
disp(‘結(jié)果為:‘)
result‘
disp(strcat(‘準(zhǔn)確率為‘num2str(accuracy*100)‘%‘))
function?[resultaccuracy]=BP_test(testtest_labelW1W2B1B2)
%返回分類的結(jié)果
%accuracy準(zhǔn)確率
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);%統(tǒng)計(jì)分類正確的個(gè)數(shù)
total=size(test1);%總個(gè)數(shù)
accuracy=right/total;
end
%sigmod函數(shù)在matlab里是logsig函數(shù)
function?[Y]=sigmod(X)
Y=1./(1+exp(-1).^X);
end
????????
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????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\周志華-機(jī)器學(xué)習(xí)-101.jpg
?????文件??????632486??2019-08-12?22:56??neural_networks\周志華-機(jī)器學(xué)習(xí)-102.jpg
?????文件??????467382??2019-08-12?22:56??neural_networks\周志華-機(jī)器學(xué)習(xí)-103.jpg
?????文件??????839981??2019-08-12?22:56??neural_networks\周志華-機(jī)器學(xué)習(xí)-104.jpg
?????目錄???????????0??2019-08-12?23:40??neural_networks\
評論
共有 條評論