BP的matlab实现

%2015.04.26 Kang Yongxin ----v 2.0
%完成作业中BP算法,采用批量方式更新权重
%%
%输入数据格式
%x 矩阵 : 样本个数*特征维度
%y 矩阵 :样本个数*类别个数(用01000形式表示)
close all;
clear all;
clc ;
load data.mat;%
x_test=x(1:3:30,:);%从原始数据中留出一部分 作为测试样本
y_test=y(1:3:30,:);
x_train=[x(2:3:30,:);x(3:3:30,:)];%x(1:2:30,:);%[x(11:25,:);x(26:30,:);x(1:10,:)];
y_train=[y(2:3:30,:);y(3:3:30,:)];%%[y(11:25,:);y(26:30,:);y(1:10,:)];
%%
%定义变量名称,初始化网络
d=size(x_train,2);%特征维度,也是输入层节点个数
num_trains=size(x_train,1);%训练样本个数
n_class=size(y_train,2);%样本类别数
node_layer=[d 4 n_class];%每层的节点个数 %[d 3 5 n_class];%构建更多层的网络
num_layer=size(node_layer,2)-1;%网络层数
for i=1:1:num_layer-1
    f_name{i}=‘sigmoid‘;%对应每层的激活函数
end
f_name{num_layer}=‘tanh‘;%‘sigmoid‘;%最后一层的激活函数
eta=0.08;%学习率
theta=10e-4;%终止条件
W=cell(num_layer,1);%初始化权重矩阵,都设曾1,
for i=1:1:num_layer
    W{i}=rand(node_layer(i),node_layer(i+1));
end
W_init=W;
%开始循环
item=1;
while item>0 && item<1500
  %%
  %初始化权值增量
   for layer=1:1:num_layer
        delta_sum{layer}=zeros(size(W{layer})) ;
   end
   %%
    for k=1:1:num_trains
        %对于每个样本的循环
       %%%%%%%%%%%%%%%%%%%
        %前向计算
        x_in=x_train(k,:);
        for layer=1:1:num_layer
            %对于每一层进行前向计算,并且保存输出值y_out
            y_out{layer}=forward(x_in,W{layer},f_name{layer});%批量更新时候W要跟随外层循环
            x_in=y_out{layer};
        end
        %%%%%%%%%%%%%%%
        %%%%%%%%%%%%%%
        %反向传播,最后一层要单算,因为只有一个输出
        delta_out{layer}=y_train(k,:)-y_out{layer};%输出与真值的差
        J(k)=0.5*sum(delta_out{layer}.^2);%均方误
        delta_error{layer}=delta_out{layer}.*d_function(y_out{layer},f_name{num_layer});%从指向节点收集到的误差
        delta_w{layer}=eta*(y_out{layer-1})‘*delta_error{layer};%本层的权重变化量
        while layer>1
           %反向传播误差,保存delta_w
           layer=layer-1;
           delta_error{layer}=delta_error{layer+1}*(W{layer+1})‘.*d_function(y_out{layer},f_name{layer});%从指向节点收集到的误差并使用之前的权重进行加权
           if layer~=1
               %如果没到第一层,就用layer-1层的输出作为输入
               delta_w{layer}=eta*(y_out{layer-1})‘*delta_error{layer};%本层的权重变化量
           else
               %如果是第一层就用本次训练的x作为输入
               delta_w{layer}=eta*(x_train(k,:))‘*delta_error{layer};%本层的权重变化量
           end
        end
       %%%%%%%%%%%%%%%
       %%%%%%%%%%%%%%%%%
       %批量更新,要对所有样的贡献进行加和
       for layer=1:1:num_layer
            delta_sum{layer}=delta_sum{layer}+delta_w{layer} ;
       end
    end%k个样本对权重 变化量的贡献计算完毕
    %%

    figure(1);
    JW(item)=sum(J);
    if item>10
        Delta_JW=abs(JW(item)-JW(item-1));
        if Delta_JW<theta
             break;%循环终止条件
        end
    end
    plot(item,JW(item),‘.‘)
    hold on;
    item=item+1;

  %更新权重
    for layer=1:1:num_layer
        %对于每一层更新权重,这个更新放的位置决定是进行批量更新还是每次更新
       W{layer}=W{layer}+delta_sum{layer};%批量更新
    end
end
%%
%计算准确率
x_in=x_test;
for layer=1:1:num_layer
    %对于每一层进行前向计算,并且保存输出值y_out
    y_out{layer}=forward(x_in,W{layer},f_name{layer});%批量更新时候W要跟随外层循环
    x_in=y_out{layer};
end
[C,I]=max(y_out{layer},[],2);
[C,I_true]=max(y_test,[],2);
Trues=find((I-I_true)==0);
Precision=size(Trues,1)/size(y_test,1)
function [ y ] = forward( x,w,f_name )
%FORWARD 前向计算得到输出值
%   输入 x:输入向量1*m
%        w:权重矩阵m*n
%        f_name:函数名称(暂时支持‘sigmoid‘‘tanh‘)
%   输出 y:输出向量1*n 公式为  y=f(x*w)
if strcmp(f_name,‘sigmoid‘)
    y=sigmoid(x*w);
else if strcmp(f_name,‘tanh‘)
        y=tanh(x*w);%matlab 自带
    else
       disp(‘wrong function name ‘);
    end
end
end
function [d_f ] = d_function( y,f_name )
%D_FOUNCTION 对相关函数进行求导数
%   输入是该层的输出值y
if strcmp(f_name,‘sigmoid‘)
    d_f=y.*(1-y);
else if strcmp(f_name,‘tanh‘)
        d_f=1-y.^2;%matlab 自带
    else
       disp(‘wrong function name at d_function‘);
    end
end
end
function [ y ] = sigmoid( x )
%MY_SIGMOID
%   输入向量x,输出
y=1./(1+exp(-x));
end
时间: 2024-10-24 06:07:55

BP的matlab实现的相关文章

浅识——后向投影成像算法(BackProjection,BP) 【MATLAB代码分析】

一.什么是BP算法 由来:BP算法最初是McCorkle受计算机层析技术的启发推导而来,所谓的计算机层析:就是CT(Computer Tomograpy),这是在医院中再普遍不过的技术了. BP算法的原理:BP算法参考了"时延-叠加"的思想,在雷达应用中,其对雷达接收天线接收到的回波信号进行距离向匹配率,获取回波数据中包含的相幅信息,再通过IFFT进行逆傅里叶变换,获取收发天线组合的时延,最后累积信号相干相加得到目标函数. 1.1  BP算法 回波信号与参与电信号进行匹配滤波后,获得的

P1问题求解相关算法

1. BP 利用matlab的线性规划工具箱,即linprog 主要思想:如何将P1问题转换为线性规划问题 即由3.1变为3.2 令x=[u; v],其中u,v均为正,a=u-v A=[phi,-phi]  (显示不了符号,读出来就好... ) b=s 则b=Ax=(u-v)=a=s 求解:x0=linprog(c,[],[],A,b,zeros(2*p,1)); 问题P1的最优解即为x0(1:p)-x0(p+1:2p) 注:这里要去掉绝对值,证明如下: 2. BPDN 基追踪去噪 利用quad

什么是神经网络

什么是神经网络? 神经网络是由很多神经元组成的,首先我们看一下,什么是神经元 上面这个图表示的就是一个神经元,我们不管其它书上说的那些什么树突,轴突的.我用个比较粗浅的解释,可能不太全面科学,但对初学者很容易理解: 1.我们把输入信号看成你在matlab中需要输入的数据,输进去神经网络后 2.这些数据的每一个都会被乘个数,即权值w,然后这些东东与阀值b相加后求和得到u, 3.上面只是线性变化,为了达到能处理非线性的目的,u做了个变换,变换的规则和传输函数有关 可能还有人问,那么那个阀值是什么呢?

BP神经网络及matlab实现

本文主要内容包括: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  找到.这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类.不同品种的Iris花的花萼长度.花萼

[matlab]bp神经网络工具箱学习笔记

基本就三个函数: newff():创建一个bp神经网络 train():训练函数 sim():仿真函数 同时具有可视化界面,但目前不知道可视化界面如何进行仿真,且设置不太全 工具箱:Neural net fitting textread使用方法:http://blog.sina.com.cn/s/blog_9e67285801010bju.html ex1. clear; clc; %注意P矩阵,matlab默认将一列作为一个输入 P=[0.5152 0.8173 1.0000 ; 0.8173

详细MATLAB 中BP神经网络算法的实现

MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里以一个普遍实用的简单案例为例子进行编程的说明. 假设一组x1,x2,x3的值对应一个y值,有2000组这样的数字,我们选择其中1900组x1,x2,x3和y作为样本,其余100组x1,x2,x3作为测试数据来验证.   首先需要读取这些数据,并把数据赋值给input 和 output . 我是把数据存储

Matlab的BP神经网络工具箱及其在函数逼近中的应用

1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈网络.本文只介绍BP神经网络工具箱. 2.BP神经网络工具箱介绍 BP神经网络学习规则是不断地调整神经网络的权值和偏值,使得网络输出的均方误差和最小.下面是关于一些BP神经网络的创建和训练的名称: (1)newff:创建一前馈BP网络(隐含层只有一层) (2)newcf:创建一多层前馈BP网络(隐含

【神经网络】BP算法解决XOR异或问题MATLAB版

第一种 %% %用神经网络解决异或问题 clear clc close ms=4;%设置4个样本 a=[0 0;0 1;1 0;1 1];%设置输入向量 y=[0,1,1,0];%设置输出向量 n=2;%输入量的个数 m=3;%隐层量的个数 k=1;%输出层的个数 w=rand(n,m);%为输入层到隐层的权值赋初值 v=rand(m,k);%为隐层到输出层的权值赋权值 yyuzhi=rand(1,m);%为输入层到隐层的阈值赋初值 scyuzhi=rand(1,1);%为隐层到输出层的阈值赋权

BP神经网络人口预测程序(matlab实现)

自己测试人口预测的matlab实现: x=[54167    55196    56300    57482    58796    60266    61465    62828    64653    65994    67207    66207    65859    67295    69172    70499    72538    74542    76368    78534    80671    82992    85229    87177    89211     90