%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

BP的matlab实现的更多相关文章

  1. 【2008nmj】BP二元分类

    在人的大脑里有数以万计的神经元,它们之间通过神经突触来连接.用以判断. BP神经网络 MATLAB实现:

  2. bp神经网络及matlab实现

    本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集 ...

  3. BP神经网络(原理及MATLAB实现)

    人工神经网络概述: 人工神经元模型: 神经网络的分类: 按照连接方式,可以分为:前向神经网络 vs. 反馈(递归)神经网络: 按照学习方式,可以分为:有导师学习神经网络 vs. 无导师学习神经网络: ...

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

    1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈 ...

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

    MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤   这里 ...

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

    基本就三个函数: newff():创建一个bp神经网络 train():训练函数 sim():仿真函数 同时具有可视化界面,但目前不知道可视化界面如何进行仿真,且设置不太全 工具箱:Neural ne ...

  7. MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合

    2.1 案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模.在这种情况下,可以建立BP神经网络表达这些非线性系统.该方法把未知系统看成是一个黑箱,首先用 ...

  8. MATLAB神经网络(1) BP神经网络的数据分类——语音特征信号分类

    1.1 案例背景 1.1.1 BP神经网络概述 BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播.在前向传递中,输入信号从输入层经隐含层逐层处理,直至输出层.每一层的神 ...

  9. 粒子群优化算法对BP神经网络优化 Matlab实现

    1.粒子群优化算法 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作 ...

随机推荐

  1. $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$

    正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...

  2. 洛谷$P5330\ [SNOI2019]$数论 数论

    正解:数论 解题报告: 传送门$QwQ$ ,,,这题还蛮妙的$QwQ$(,,,其实所有数论题对我来说都挺妙的$kk$然后我真的好呆昂我理解了好久$QAQ$ 考虑先建$Q$个点,编号为$[0,Q)$,表 ...

  3. SpringBoot整合Thymeleaf-基于SpringBoot2.X版本

    1.为啥要用Thymeleaf模板引擎?现在不都前后端分离了么? 熊dei们,别着急,我们先来谈谈为啥开始用Thymeleaf模板引擎,先照顾照顾下我们这些可爱的小白童鞋.... 为啥开始用Thyme ...

  4. loongson编译所遇问题

    环境:虚拟机VMware +Ubuntu18.04+gcc4.9.3 使用gcc4.9.3编译时出错,提示需要运行命令:make -C /work/loongson0103/vUDK2018-loon ...

  5. 浅谈Linux下/etc/passwd文件

    浅谈Linux 下/etc/passwd文件 看过了很多渗透测试的文章,发现在很多文章中都会有/etc/passwd这个文件,那么,这个文件中到底有些什么内容呢?下面我们来详细的介绍一下. 在Linu ...

  6. 1050 螺旋矩阵 (25 分)C语言

    本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...

  7. 1061 判断题 (15 分)C语言

    判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量.第二行给出 M ...

  8. PHP 转化 Excel导入时间

    $fixation = 25569; $fixationT = 24 * 60 * 60; $date = gmdate('Y-m-d H:i:s', ('excel导入的时间'- $fixation ...

  9. GC 为什么要挂起用户线程? 什么愁什么怨?

    GC 为什么要挂起用户线程? 什么愁什么怨? 前言 JVM 系列文章的第一篇.敬请期待后续. 故障描述 某年某月某日 上午,线上发生故障,经过排查,发现某核心服务 Dubbo 接口超时. 故障根源 查 ...

  10. Netty快速入门(06)Netty介绍

    前面简单的介绍了Java I/O 和NIO,写了示例程序. Java I/O是阻塞的,为了让它支持多个并发,就要针对每个链接启动线程,这种方式的结果就是在海量链接的情况下,会创建海量的线程,就算用线程 ...