簡單易學的機器學習算法——神經網絡之BP神經網絡


一、BP神經網絡的概念

    BP神經網絡是一種多層的前饋神經網絡,其基本的特點是:信號是前向傳播的,而誤差是反向傳播的。詳細來說。對於例如以下的僅僅含一個隱層的神經網絡模型:

(三層BP神經網絡模型)
BP神經網絡的過程主要分為兩個階段。第一階段是信號的前向傳播,從輸入層經過隱含層。最后到達輸出層;第二階段是誤差的反向傳播,從輸出層到隱含層。最后到輸入層,依次調節隱含層到輸出層的權重和偏置,輸入層到隱含層的權重和偏置。

二、BP神經網絡的流程

    在知道了BP神經網絡的特點后,我們須要根據信號的前向傳播和誤差的反向傳播來構建整個網絡。

1、網絡的初始化

    如果輸入層的節點個數為,隱含層的節點個數為,輸出層的節點個數為

輸入層到隱含層的權重,隱含層到輸出層的權重為,輸入層到隱含層的偏置為,隱含層到輸出層的偏置為。學習速率為,激勵函數為。當中激勵函數為取Sigmoid函數。形式為:


2、隱含層的輸出

    如上面的三層BP網絡所看到的,隱含層的輸出

3、輸出層的輸出


4、誤差的計算

    我們取誤差公式為:

當中為期望輸出。

我們記,則能夠表示為


以上公式中。

5、權值的更新

    權值的更新公式為:

這里須要解釋一下公式的由來:
這是誤差反向傳播的過程,我們的目標是使得誤差函數達到最小值。即。我們使用梯度下降法:
  • 隱含層到輸出層的權重更新
則權重的更新公式為:

  • 輸入層到隱含層的權重更新
當中



則權重的更新公式為:

6、偏置的更新

    偏置的更新公式為:

  • 隱含層到輸出層的偏置更新
則偏置的更新公式為:

  • 輸入層到隱含層的偏置更新
當中



則偏置的更新公式為:

7、推斷算法迭代是否結束

    有非常多的方法能夠推斷算法是否已經收斂,常見的有指定迭代的代數,推斷相鄰的兩次誤差之間的區別是否小於指定的值等等。

三、實驗的仿真

    在本試驗中。我們利用BP神經網絡處理一個四分類問題,終於的分類結果為:

MATLAB代碼

主程序
%% BP的主函數

% 清空
clear all;
clc;

% 導入數據
load data;

%從1到2000間隨機排序
k=rand(1,2000);
[m,n]=sort(k);

%輸入輸出數據
input=data(:,2:25);
output1 =data(:,1);

%把輸出從1維變成4維
for i=1:2000
    switch output1(i)
        case 1
            output(i,:)=[1 0 0 0];
        case 2
            output(i,:)=[0 1 0 0];
        case 3
            output(i,:)=[0 0 1 0];
        case 4
            output(i,:)=[0 0 0 1];
    end
end

%隨機提取1500個樣本為訓練樣本,500個樣本為預測樣本
trainCharacter=input(n(1:1600),:);
trainOutput=output(n(1:1600),:);
testCharacter=input(n(1601:2000),:);
testOutput=output(n(1601:2000),:);

% 對訓練的特征進行歸一化
[trainInput,inputps]=mapminmax(trainCharacter');

%% 參數的初始化

% 參數的初始化
inputNum = 24;%輸入層的節點數
hiddenNum = 50;%隱含層的節點數
outputNum = 4;%輸出層的節點數

% 權重和偏置的初始化
w1 = rands(inputNum,hiddenNum);
b1 = rands(hiddenNum,1);
w2 = rands(hiddenNum,outputNum);
b2 = rands(outputNum,1);

% 學習率
yita = 0.1;

%% 網絡的訓練
for r = 1:30
    E(r) = 0;% 統計誤差
    for m = 1:1600
        % 信息的正向流動
        x = trainInput(:,m);
        % 隱含層的輸出
        for j = 1:hiddenNum
            hidden(j,:) = w1(:,j)'*x+b1(j,:);
            hiddenOutput(j,:) = g(hidden(j,:));
        end
        % 輸出層的輸出
        outputOutput = w2'*hiddenOutput+b2;
        
        % 計算誤差
        e = trainOutput(m,:)'-outputOutput;
        E(r) = E(r) + sum(abs(e));
        
        % 改動權重和偏置
        % 隱含層到輸出層的權重和偏置調整
        dw2 = hiddenOutput*e';
        db2 = e;
        
        % 輸入層到隱含層的權重和偏置調整
        for j = 1:hiddenNum
            partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
            partTwo(j) = w2(j,:)*e;
        end
        
        for i = 1:inputNum
            for j = 1:hiddenNum
                dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
                db1(j,:) = partOne(j)*partTwo(j);
            end
        end
        
        w1 = w1 + yita*dw1;
        w2 = w2 + yita*dw2;
        b1 = b1 + yita*db1;
        b2 = b2 + yita*db2;  
    end
end

%% 語音特征信號分類
testInput=mapminmax('apply',testCharacter',inputps);

for m = 1:400
    for j = 1:hiddenNum
        hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);
        hiddenTestOutput(j,:) = g(hiddenTest(j,:));
    end
    outputOfTest(:,m) = w2'*hiddenTestOutput+b2;
end

%% 結果分析
%根據網絡輸出找出數據屬於哪類
for m=1:400
    output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
end

%BP網絡預測誤差
error=output_fore-output1(n(1601:2000))';

k=zeros(1,4);  
%找出推斷錯誤的分類屬於哪一類
for i=1:400
    if error(i)~=0
        [b,c]=max(testOutput(i,:));
        switch c
            case 1 
                k(1)=k(1)+1;
            case 2 
                k(2)=k(2)+1;
            case 3 
                k(3)=k(3)+1;
            case 4 
                k(4)=k(4)+1;
        end
    end
end

%找出每類的個體和
kk=zeros(1,4);
for i=1:400
    [b,c]=max(testOutput(i,:));
    switch c
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
        case 3
            kk(3)=kk(3)+1;
        case 4
            kk(4)=kk(4)+1;
    end
end

%正確率
rightridio=(kk-k)./kk

激活函數
%% 激活函數
function [ y ] = g( x )
    y = 1./(1+exp(-x));
end



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM