BP神经网络的数据分类(MATHLAB实现)

一。概述

BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。在前向传递中,输入信号从输入层经隐含层处理,直至输出层。每一层的神经元状态只影响下一层神经元状态。如果输出层得不到期望输出,则转入反向传播,根据预测误差调整网络权值和阈值,从而使BP神经网络预测输出不断逼近期望输出。

二。BP神经网络的训练过程包含以下几个步骤:

步骤一:网络初始化。根据输入输出序列确定网络输入层节点数n,隐含层节点数l,输出层节点数m,初始化输入层,隐含层和输出层神经元之间的连接权值,初始化隐含层阈值,输出层阈值,给定学习速率和神经元激励函数。

步骤二:隐含层输出计算。根据输入向量X,输入层和隐含层间连接权值w_{ij},以及隐含层阈值啊,计算隐含层输出H。

H_{j} = \int\left ( \sum_{i = 1}^{n}w_{ij}x_{i} - a_{j}}} \right ) j = 1,2,...,l式中,l为隐含层节点数,f为隐含层激励函数,该函数有多种表达形式,本例所选函数为:f\left ( x \right ) = 1\setminus \left ( 1 + e^{-x} \right )

步骤三:输出层输出计算。根据隐含层输出H,连接权值w_{jk}和阈值b,计算BP神经网络预测输出O.

O_{k} = \sum_{j = 1}^{l}H_{j}w_{jjk} - b_{k} ............k = 1,2,...,m

步骤四:误差计算。根据网络预测输出O和期望输出Y,计算网络预测误差e。

e_{k} = Y_{k} - O_{k}........... k = 1,2,...,m

步骤五:权值更新。根据网络预测误差e更新网络连接权值w_{ij},w_{jk}

w _{ij} = w _{ij} +\eta H_{j}\left ( 1 - H_{j} \right )x\left ( i \right )\sum_{k = 1}^{m}w_{jk}e_{k}......... i = 1,2,...,n;j = 1,2,...,l

w_{jk} = w_{jk} + \eta H_{j}e_{k} .........j = 1,2,...,l;k = 1,2,...,m

\eta为学习速率。

步骤六:阈值更新。根据网络预测误差e更新网络节点阈值a,b.

a_{j} = a_{j} +\eta H_{j}\left ( 1- H_{i} \right )\sum_{k =1}^{m}w_{jk}e_{k}.....j = 1,2,...,l

b_{k} = b_{k} + e_{k}...........k = 1,2,...,m

步骤七:判断算法迭代是否结束,若没有结束,返回步骤二。

 

三。MATLAB实现

%清空环境变量
clc
clear

%导入四类信号
load data1 c1
load data2 c2
load data3 c3
load data4 c4


%将四类信号合为一组
data(1:500,:) = c1(1:500,:);
data(501:1000,:) = c2(1:500,:);
data(1001:1500,:) = c3(1:500,:);
data(1501:2000,:) = c4(1:500,:);


%输入输出数据
input = data(:,2:25);
output1 = data(:,1);

%设定每组输入输出信号
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组数据作为预测数据
k = rand(1,2000);
[m,n] = sort(k);

input_train = input(n(1:1500),:)';
output_train = input(n(1:1500),:)';
input_test = input(n(1501:2000),:)';
output_test = output(n(1501:2000),:)';

%输入数据归一化
[inputn,inputps] = mapminmax(input_train);

%网络结构
innum = 24;
midnum = 25;
outnum = 4;

%权值阈值初始化
w1 = rands(midnum,innum);
b1 = rands(midnum,1);
w2 = rands(midnum,outnum);
b2 = rands(outnum,1);

for ii = 1:20
    E(ii) = 0; %训练误差
    for i = 1:1:1500
        %选择本次训练数据
        x = inputn(:,i);
        
        %隐含层输出
        for j = 1:1:midnum
            I(j) = inputn(:,i)'*w1(j,:)'+b1(j);
            Iout(j) = 1/(1+exp(-I(j)));
        end
        %输出层输出
        yn = w2'*Iout'+b2;
        
        %预测误差
        e = output_train(:,i) - yn;
        E(ii) = E(ii) + sum(ads(e));
        
        %计算w2.b2调整量
        dw2 = e*Iout;
        db2 = e';
        
        %计算w1,b1调整量
        for j=1:1:midnum
            S = 1/(1+exp(-I(j)));
            FI(j) = S*(1-S);
        end
        for k = 1:1:innum
            for j = 1:1:midnum
                dw1(k,j) = FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
                db1(j) = FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
            end
        end
        
        %权值阈值更新
        w1 = w1_1 + xite*dw1';
        b1 = b1_1 + xite*db1';
        w2 = w2_1 + xite*dw2';
        b2 = b2_1 + xite*db2';
        
        
        %保存结果
        w1_1 = w1;
        w2_1 = w2;
        b1_1 = b1;
        b2_1 = b2;
               
    end
end


%BP神经网络分类

%输入数据归一化
inputn_test = mapminmax('apply',input_test,inputps);

%网络检测
for i = 1:5000
    for j = 1:1:midnum
        I(j) = inputn_test(:,i)'*w1(j,:)'+b1(j);
        Iout(j) = 1/(1+exp(-I(j)));
    end
    
    %预测结果
    fore(:,i) = w2'*Iout'+b2;
end

%类别统计
for i= 1;500
    output_fore(i) = find(fore(:,i) == max(fore(:,i)));
end

%预测误差
error = output_fore - output1(n(1501,2000))';
k = zeros(1:4);

%统计误差
for i = 1:500
    if error(i)~=0
        [b,c] = max(output_test(:,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
                
%统计正确率
rightridio = (kk - k)./kk








 

 

 

 

 

 

 

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值