神经网络之后向传播分类(Classification by Backpropagation)

本算法是根据《数据挖掘概念与技术》第三版中的后向传播分类算法实现而来,中文书籍中有不少细节错误,影响阅读与判断,推荐看原书《Data Mining Concepts and Techniques》第三版。阅读本文需要注意以下两点:一是本文在与原书数据保持一致的情况下构造了输入数据矩阵文件,矩阵的下标与节点是相对应的,这点在程序中做了详细说明;二是While循环条件原书没有具体的设定,而且实验中也只是循环了一次,所以本程序也只进行了单次的验证,具体的设定需要根据实际情况而定。

本文参考原著,所以给出原著中该算法的伪代码,以及网络结构截图,更为详细的说明请参照原书

以下是该算法实现的Matlab程序:

clc;
clear;
%加载测试数据文件
fileID = fopen('D:\matlabFile\Backward propagation\BP.txt');
DS=textscan(fileID,'%f %f %f %f %f %f');
fclose(fileID);
%将数据转换为矩阵格式,该矩阵的第一行为输入值,最后一行为输出值,倒数第二行为各节点的偏移量,中间为权重矩阵,
BP=[];
for i=1:length(DS)
    BP=cat(2,BP,DS{i});
end
%取出输入层
Input=BP(1,:);
%取出偏移量
[Row,Column]=size(BP);
Theta=BP(Row-1,:);
%取出输出值
Output=BP(Row,:);
%取出权重矩阵,该矩阵因为是对称矩阵,所以我们只取上半部分
Weight=BP(2:Row-2,:);
%对各层的目标值进行设定,这里为了计算方便,将输入层也纳入计算,与输入值保持一致,隐藏层没有目标值,设为0,输出层为1
Target=Input;
Target(Column)=1;
%定义学习率
L=0.9;
%对输入层进行备份
Input_hidden=Input;
%%%%%%========这里特别要注意===========循环条件视情况而定,这里只是临时设定一个条件
while L>0 
    %将输入层的值直接赋给输出值
    for i=1:length(Input)
        if Input(i)~=0
            Output(i)=Input(i);
        end
    end
    %计算隐藏层和输出层的值,这里为了方便计算,对权重矩阵进行了转置
    Weight=Weight';
    for i=1:Column
        %计算隐藏节点的输入值
        Input_H=0;
        for j=1:i
           Input_H=Input_H+Weight(i,j)*Output(j);
        end
        %在输入值上加偏移量
        Input_hidden(i)=Input_H+Theta(i);
        if Input_hidden(i)~=0
            %计算隐藏节点的输出量
            Output(i)=1/(1+exp(-Input_hidden(i)));   
        end 
    end   
    %后向传播误差矩阵
    Err=size(1,Column);
    %计算每一个节点的误差
    %首先计算输出层的误差,这里输出值的目标值为1
    Err(Column)=Output(Column)*(1-Output(Column))*(Target(Column)-Output(Column));
    %计算其他层的误差,输入层都为0
    for i=Column-1:-1:1
        Err_sum=0;
        for j=i+1:Column
            %这里注意权重矩阵做了转置,对下标进行了交换
            Err_sum=Err_sum+Weight(j,i)*Err(j);
        end        
        Err(i)=Output(i)*(1-Output(i))*Err_sum;
    end
    %更新权重矩阵
    for i=1:Column
        for j=1:i
            %原为零值,直接跳过
            if Weight(i,j)==0
                continue;
            end
            Weight(i,j)=Weight(i,j)+L*Err(i)*Output(j);
        end
    end
    %更新偏移量
    for i=1:Column
        Theta(i)=Theta(i)+L*Err(i);
    end       
end

下面是数据文件,拷贝之后保存为BP.txt

1 0 1 0 0 0
0 0 0 0.2 -0.3 0
0 0 0 0.4 0.1 0
0 0 0 -0.5 0.2 0
0 0 0 0 0 -0.3
0 0 0 0 0 -0.2
0 0 0 0 0 0
0 0 0 -0.4 0.2 0.1
0 0 0 0 0 0





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值