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
BP的matlab实现的更多相关文章
- 【2008nmj】BP二元分类
在人的大脑里有数以万计的神经元,它们之间通过神经突触来连接.用以判断. BP神经网络 MATLAB实现:
- bp神经网络及matlab实现
本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例 本文以Fisher的Iris数据集 ...
- BP神经网络(原理及MATLAB实现)
人工神经网络概述: 人工神经元模型: 神经网络的分类: 按照连接方式,可以分为:前向神经网络 vs. 反馈(递归)神经网络: 按照学习方式,可以分为:有导师学习神经网络 vs. 无导师学习神经网络: ...
- Matlab的BP神经网络工具箱及其在函数逼近中的应用
1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈 ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- [matlab]bp神经网络工具箱学习笔记
基本就三个函数: newff():创建一个bp神经网络 train():训练函数 sim():仿真函数 同时具有可视化界面,但目前不知道可视化界面如何进行仿真,且设置不太全 工具箱:Neural ne ...
- MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合
2.1 案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模.在这种情况下,可以建立BP神经网络表达这些非线性系统.该方法把未知系统看成是一个黑箱,首先用 ...
- MATLAB神经网络(1) BP神经网络的数据分类——语音特征信号分类
1.1 案例背景 1.1.1 BP神经网络概述 BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播.在前向传递中,输入信号从输入层经隐含层逐层处理,直至输出层.每一层的神 ...
- 粒子群优化算法对BP神经网络优化 Matlab实现
1.粒子群优化算法 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作 ...
随机推荐
- 配置一个yum私有仓库
使用一台服务器配置私有仓库做yum源,本身使用file,客户端使用http连接 安装http服务: [root@ceph1 ~]# yum -y install httpd 修改配置文件 Docume ...
- 从头学pytorch(十二):模型保存和加载
模型读取和存储 总结下来,就是几个函数 torch.load()/torch.save() 通过python的pickle完成序列化与反序列化.完成内存<-->磁盘转换. Module.s ...
- 洛谷$ P$4317 花神的数论题 数位$dp$
正解:数位$dp$ 解题报告: 传送门! 开始看到感觉有些新奇鸭,仔细一想发现还是个板子鸭,,, 考虑设$f_{i}$表示$sum[j]=i$的$j$的个数 日常考虑$dfs$呗,考虑变量要设哪些$Q ...
- $[NOIp2017]$ 逛公园 $dp$/记搜
\(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq 10^5,k\leq ...
- 详解js的bind、call、apply
详解js的bind.call.apply 说明 虽然bind.call.apply都是js很基础的一块知识,但是我从未认真总结过这三者的区别. 由于公司后端是用的微服务架构,又没有中间层对接,导致前端 ...
- Python 打包的现状:包的三种类型
英文 | The state of Python Packaging[1] 原作 | BERNAT GABOR 译者 | 豌豆花下猫 声明 :本文获得原作者授权翻译,转载请保留原文出处,请勿用于商业或 ...
- 前端加密MD5
今天接触了MD5加密方式,记录一下使用方法,又去搜了搜关于MD5的详细内容 MD5在vue中使用方法 1.下载MD5模块 cnpm install md5 -S 2.引入模块 const md5 = ...
- 08_jquery里面的$(this)和this都什么时候用,有什么区别
当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...
- .NET Core将促使.NET进一步衰落
我是十几年的.NET开发者,对.NET的历史发展比较了解,算是非常资深的了. 微软一向喜欢把开发者带到自己铺设的死路上,等开发者走到死路尽头的时候,会潇洒地再次铺设一条死路. .NET Core优势是 ...
- 【Java基础总结】数据库编程
MySQL数据库查询 import java.sql.*; public class JdbcDemo1{ public static void main(String[] args){ try{ / ...