%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. Spring Boot 整合 slf4j+log4j 实现日志管理

    一:首先新建一个jar项目,如下图: 二:添加log4j的依赖,如下pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0 ...

  2. linux 没有音频输出的解决方式

    用户级别的-/.asoundrc 文件. 如果文件不存在,可以手动创建. 其中的各个 ID,请根据实际情况调整: defaults.pcm.card 1 defaults.pcm.device 0 d ...

  3. win设置C、D、E等盘符图标为自定义的图片

    1.选择一张jpg图片,在下面网站工具上,转为ico的图片(最好转64x64的清晰些). http://www.faviconico.org/favicon 2.在D盘下新建文本文件.txt,写入以下 ...

  4. JavaScript | ES6 新增

    Evernote Export body, td { font-family: 微软雅黑; font-size: 10pt; } ES6 重点知识 this关键字以及bind let/const 变量 ...

  5. JPA或Hibernate中使用原生SQL实现分页查询、排序

    发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...

  6. 顺丰丰桥软件开发工具包 (.NET)

    丰桥 - 一站式对接服务平台, 打通客户与顺丰系统之间的信息流, 实现物流供应链一体化. 随着一个电商项目和顺丰合作, 信息流对接就是我们开发的事了. 顺丰通过丰桥提供了一些开放接口, 不过丰桥提供的 ...

  7. Java之File类用法总结

    File类概述:文件和文件目录路径的抽象表达形式,与平台无关.1.File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入/输出流.2.想要在J ...

  8. CSP-S rp++

    心无旁骛 认真思考 努力骗分(哈哈) I Love CSP! 反正像我这种大菜鸟也考不了多少 尽力打 本次考试期望 day1 100 70-100 30-? day2 100 ? ? 总:300-? ...

  9. Airtest入门篇

    Airtest是啥? 简单理解:基于图像识别的UI自动化测试框架 俗人理解:截图即可完成自动化测试 适用场景:游戏.APP.PC软件,支持Window.Android.IOS Airtest官方文档 ...

  10. Heroku学习 - 利用Heroku app实现 OrgA 查询Org B 的数据数据

    最近研究了一番如何通过Heroku应用对OrgA开放一个接口,参数传递的是一个SQL,APP的负责将SQL通过callout的形式调用目标OrgB Rest API来获取数据并返回给OrgA.我是用的 ...