简单易学的机器学习算法——神经网络之BP神经网络
一、BP神经网络的概念
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29vZ2xlMTk4OTAxMDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
二、BP神经网络的流程
1、网络的初始化
l" title="l" alt="" style="font-family:FangSong_GB2312; font-size:18px" />,输出层的节点个数为
m" title="m" alt="" style="font-family:FangSong_GB2312; font-size:18px" />。
输入层到隐含层的权重,隐含层到输出层的权重为
\omega_{jk}" title="\omega_{jk}" alt="" />,输入层到隐含层的偏置为,隐含层到输出层的偏置为
。学习速率为
,激励函数为
。当中激励函数为
取Sigmoid函数。形式为:
2、隐含层的输出
3、输出层的输出
4、误差的计算
我们记
Y_k-O_k=e_k" title="Y_k-O_k=e_k" alt="" />,则能够表示为
E=\frac{1}{2}\sum_{k=1}^{m}e_k^2" title="E=\frac{1}{2}\sum_{k=1}^{m}e_k^2" alt="" />
i=1\cdots&space;n" title="i=1\cdots n" alt="" />,,
。
5、权值的更新
\left\{\begin{matrix}&space;\omega&space;_{ij}=\omega&space;_{ij}+\eta&space;H_j\left&space;(&space;1-H_j&space;\right&space;)x_i\sum_{k=1}^{m}\omega&space;_{jk}e_k\\&space;\omega&space;_{jk}=\omega&space;_{jk}+\eta&space;H_je_k&space;\end{matrix}\right." title="\left\{\begin{matrix} \omega _{ij}=\omega _{ij}+\eta H_j\left ( 1-H_j \right )x_i\sum_{k=1}^{m}\omega _{jk}e_k\\ \omega _{jk}=\omega _{jk}+\eta H_je_k \end{matrix}\right." alt="" />
min&space;E" title="min E" alt="" />。我们使用梯度下降法:
- 隐含层到输出层的权重更新
- 输入层到隐含层的权重更新
\frac{\partial&space;E}{\partial&space;w_{ij}}=\frac{\partial&space;E}{\partial&space;H_j}\cdot&space;\frac{\partial&space;H_j}{\partial&space;\omega&space;_{ij}}" title="\frac{\partial E}{\partial w_{ij}}=\frac{\partial E}{\partial H_j}\cdot \frac{\partial H_j}{\partial \omega _{ij}}" alt="" />
6、偏置的更新
- 隐含层到输出层的偏置更新
b_k=b_k+\eta&space;e_k" title="b_k=b_k+\eta e_k" alt="" />
- 输入层到隐含层的偏置更新
7、推断算法迭代是否结束
三、实验的仿真
MATLAB代码
%% BP的主函数 % 清空
clear all;
clc; % 导入数据
load data; %从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k); %输入输出数据
input=data(:,2:25);
output1 =data(:,1); %把输出从1维变成4维
for i=1:2000
switch output1(i)
case 1
output(i,:)=[1 0 0 0];
case 2
output(i,:)=[0 1 0 0];
case 3
output(i,:)=[0 0 1 0];
case 4
output(i,:)=[0 0 0 1];
end
end %随机提取1500个样本为训练样本,500个样本为预測样本
trainCharacter=input(n(1:1600),:);
trainOutput=output(n(1:1600),:);
testCharacter=input(n(1601:2000),:);
testOutput=output(n(1601:2000),:); % 对训练的特征进行归一化
[trainInput,inputps]=mapminmax(trainCharacter'); %% 參数的初始化 % 參数的初始化
inputNum = 24;%输入层的节点数
hiddenNum = 50;%隐含层的节点数
outputNum = 4;%输出层的节点数 % 权重和偏置的初始化
w1 = rands(inputNum,hiddenNum);
b1 = rands(hiddenNum,1);
w2 = rands(hiddenNum,outputNum);
b2 = rands(outputNum,1); % 学习率
yita = 0.1; %% 网络的训练
for r = 1:30
E(r) = 0;% 统计误差
for m = 1:1600
% 信息的正向流动
x = trainInput(:,m);
% 隐含层的输出
for j = 1:hiddenNum
hidden(j,:) = w1(:,j)'*x+b1(j,:);
hiddenOutput(j,:) = g(hidden(j,:));
end
% 输出层的输出
outputOutput = w2'*hiddenOutput+b2; % 计算误差
e = trainOutput(m,:)'-outputOutput;
E(r) = E(r) + sum(abs(e)); % 改动权重和偏置
% 隐含层到输出层的权重和偏置调整
dw2 = hiddenOutput*e';
db2 = e; % 输入层到隐含层的权重和偏置调整
for j = 1:hiddenNum
partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
partTwo(j) = w2(j,:)*e;
end for i = 1:inputNum
for j = 1:hiddenNum
dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
db1(j,:) = partOne(j)*partTwo(j);
end
end w1 = w1 + yita*dw1;
w2 = w2 + yita*dw2;
b1 = b1 + yita*db1;
b2 = b2 + yita*db2;
end
end %% 语音特征信号分类
testInput=mapminmax('apply',testCharacter',inputps); for m = 1:400
for j = 1:hiddenNum
hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);
hiddenTestOutput(j,:) = g(hiddenTest(j,:));
end
outputOfTest(:,m) = w2'*hiddenTestOutput+b2;
end %% 结果分析
%根据网络输出找出数据属于哪类
for m=1:400
output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
end %BP网络预測误差
error=output_fore-output1(n(1601:2000))'; k=zeros(1,4);
%找出推断错误的分类属于哪一类
for i=1:400
if error(i)~=0
[b,c]=max(testOutput(i,:));
switch c
case 1
k(1)=k(1)+1;
case 2
k(2)=k(2)+1;
case 3
k(3)=k(3)+1;
case 4
k(4)=k(4)+1;
end
end
end %找出每类的个体和
kk=zeros(1,4);
for i=1:400
[b,c]=max(testOutput(i,:));
switch c
case 1
kk(1)=kk(1)+1;
case 2
kk(2)=kk(2)+1;
case 3
kk(3)=kk(3)+1;
case 4
kk(4)=kk(4)+1;
end
end %正确率
rightridio=(kk-k)./kk
激活函数
%% 激活函数
function [ y ] = g( x )
y = 1./(1+exp(-x));
end
简单易学的机器学习算法——神经网络之BP神经网络的更多相关文章
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- 简单易学的机器学习算法—SVD奇异值分解
简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义 假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...
- 简单易学的机器学习算法——决策树之ID3算法
一.决策树分类算法概述 决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类.例如对于如下数据集 (数据集) 其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是 ...
- RBF神经网络和BP神经网络的关系
作者:李瞬生链接:https://www.zhihu.com/question/44328472/answer/128973724来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 机器学习:python使用BP神经网络示例
1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够) 1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调 ...
- 机器学习(一):梯度下降、神经网络、BP神经网络
这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...
- 神经网络与BP神经网络
一.神经元 神经元模型是一个包含输入,输出与计算功能的模型.(多个输入对应一个输出) 一个神经网络的训练算法就是让权重(通常用w表示)的值调整到最佳,以使得整个网络的预测效果最好. 事实上,在神经网络 ...
随机推荐
- Android之UtilsRequesServicetHelp工具类
package com.example.getnetutil; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; ...
- 0x51 线性DP
数据结构没什么好写的..分块和整体二分还有点分学得很懂..果然我还是比较适合这些东西 poj2279 奇怪题,我的想法就是五维记录最边上的一斜排,会M,结果的的确确是锻炼思维的,正解并不是DP2333 ...
- Swift - 将String类型的数字转换成数字类型(支持十进制、十六进制)
1,十进制的字符串转成数字 Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = ...
- 【POJ 1703】 Find them,Catch them
[题目链接] http://poj.org/problem?id=1703 [算法] 并查集 + 拆点 [代码] #include <algorithm> #include <bit ...
- golang互斥锁和读写锁
一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开 ...
- Elasticsearch之cur查询索引
前提, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 Elasticsearch之curl创建索引库和索引时注意事项 Elasticsearch之cur ...
- 原生js仿淘宝手机购买选项代码
这是一款基于原生js实现仿淘宝手机信息购买选项效果源码,界面整体效果仿照淘宝购物选项设计,点击不同选项还可实时显示不同的价格计算结果,界面简洁大方.美观实用.可兼容目前最新的各类主流浏览器. 在线演示 ...
- 2018最新WordPress缩略图设置方法
缩略图设置的方法很多,但都不全面,且很多教程已经失效了,其中使用插件来实现,可是那些插件都使用过都不能实现效果,所以我整理了一份使用代码实现缩略图的方法. 1.找到网站根目录/wp-content/t ...
- python第三方库 pip 豆瓣源
pip install xxx -i http://pypi.douban.com/simple/ xxx 为包名
- Java数组的运用
Java数组 应用1: 大乐透彩票模拟器: 规则: 前区01-35中随机生成5个号码 后区01-12中随机生成2个号码 模拟操作,系统自动生成号码组合,并且按从小到大的顺序输出结果 同时要求可以选择生 ...