基於BP神經網路的分類

2021-09-22 23:08:55 字數 2842 閱讀 2174

使用的是乙個簡單的資料集fisheriris,該資料集資料類別分為3類,setosa,versicolor,virginica。每類植物有50個樣本,共150個樣本代表150朵花瓣。每個樣本有4個屬性,分別為花萼長,花萼寬,花瓣長,花瓣寬。其中meas是150*4的矩陣代表著有150個樣本每個樣本有4個屬性描述,species代表著這150個樣本的分類。

原始的資料集中的標籤格式如下所示:

setosa

setosa

versicolor

versicolor

virginica

virginica

為了能夠進行在bp神經網路訓練時更好的進行處理,首先使用matlab將以上字串標籤更改為數字標籤,其中setosa對應於數字1,versicolor對應於數字2,virginica對應於數字3。

然後使用matlab建立的神經網路結構,其中神經網路的輸入值個數為3個,隱含層的個數為4層。神經網路訓練引數的設定分別為:最大迭代次數1000次,訓練的目標為10-3,學習率設定為0.01。

如圖所示為使用matlab進行神經網路進行訓練之後的回歸結果,可以看出**出的結果大致分成了三個部分,大都距離45度斜線很近。

然後對訓練後得到的30組結果進行反歸一化後,再計算出的標籤值與實際標籤值的相對誤差,畫出30組測試集所得出的結果與測試集標籤值相對誤差的點線圖如圖所示。從圖中我們可以看出,有一組資料結果的誤差達到了50%以上,其餘的誤差大都在20%以下,由此結果是可以取得較高的準確率的。 

下圖中為對應的計算出的標籤值與實際標籤值的對比,其中橘色的點為標籤的世紀值,藍色的點為使用bp神經網路計算出的標籤值,可以看出在大多數情況下,每組資料的兩個點之間的距離是比較接近的。本例中使用計算出的標籤值與真實標籤值相差30%以內視為**正確,則圖中所示**正確率為96.67%。

clc% 匯入資料

load fisheriris.mat

%將標籤從字元改變為數字

for i=1:150

temp1 = species(i,1);

if (strcmp(temp1,'setosa'))

label(i,1) = 0;

endif (strcmp(temp1,'versicolor'))

label(i,1) = 1;

endif (strcmp(temp1,'virginica'))

label(i,1) = 2;

endend% 隨機產生訓練集和測試集

temp = randperm(size(meas,1));

% 訓練集——120個樣本

p_train = meas(temp(1:120),:)';

t_train = label(temp(1:120),:)';

% 測試集——30個樣本

p_test = meas(temp(121:end),:)';

t_test = label(temp(121:end),:)';

n = size(p_test,2);

% 資料歸一化

[p_train, ps_input] = mapminmax(p_train,0,1);

[t_train, ps_output] = mapminmax(t_train,0,1);

% 建立網路

net = newff(p_train,t_train,9);

%設定訓練引數

net.trainparam.epochs = 1000;

net.trainparam.goal = 1e-3;

net.trainparam.lr = 0.01;

%訓練網路

net = train(net,p_train,t_train);

%**測試

t_sim = sim(net,p_test);

% 資料反歸一化

t_sim = mapminmax('reverse',t_sim,ps_output);

%相對誤差error

error = abs(t_sim - t_test)./t_test;

%決定係數r^2

r2 = (n * sum(t_sim .* t_test) - sum(t_sim) * sum(t_test))^2 / ((n * sum((t_sim).^2) - (sum(t_sim))^2) * (n * sum((t_test).^2) - (sum(t_test))^2));

%結果對比

result = [t_test' t_sim' error']

%繪圖figure

plot(1:n,t_test,'b:*',1:n,t_sim,'r-o')

legend('真實標籤值','**結果')

xlabel('測試集')

ylabel('標籤')

string = ;

title(string)

j = 0;

for i=1:30

err=error(1,i)

if (err>0.3 && err~=inf)

j=j+1;

endendrate = (30-j)/30

注:最後乙個圖是把資料貼上出去使用excel畫的,所以以上程式執行出的第三個圖會和博文中有差異 。

BP神經網路(基於MATLAB)

clc clear all 匯入資料 load s data.mat s含量所用資料 n 12 n 是自變數的個數 m 1 m 是因變數的個數 讀取訓練資料 train num 1600 訓練樣本數 train data s data 1 train num,特徵值歸一化 train input,m...

BP神經網路

基本bp神經網路演算法包括 訊號的前向傳播 誤差的反向傳播 也即計算實際輸出時按照輸入到輸出的方向進行,權值閾值調整則相反。bp是一種多層前饋神經網路,由輸入層 隱含層和輸出層組成。層與層之間有兩種訊號在流動 一種是從輸入流向輸出的工作訊號,是輸入和權值的函式 另一種是輸入流向輸出的訊號,即誤差。隱...

BP神經網路

x 為輸入向量,y為隱藏層的神經元,z 為輸出層,d為目標真實值,本文預設 z 不經過sigmod處理。x y的權重為 w,y z的權重為 v yj ix iwij 1 oyi f y j 2 其中激勵函式f x 1 1 e x f x f x 1 f x 3 z k j f yj vjk 此時系統...