感知机和BP神经网络
一、感知机
1.感知机的概念
感知机是用于二分类的线性分类模型,其输入是实例的特征向量,输出是实例的类别,类别取+1和-1二个值,+1代表正类,-1代表负类。感知机对应于输入空间(特征空间)中将实例分为正负两类的分割超平面,属于判别模型。感知机学习算法简单易于实现,分为原始形式和对偶形式。
2.感知机的原理
感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。
假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面

3.感知机的损失函数
我们首先定义对于样本(xi,yi)(xi,yi),如果w⋅xi+b||w||>0w⋅xi+b||w||>0则记yi=+1yi=+1,如果w⋅xi+b||w||<0w⋅xi+b||w||<0则记yi=−1yi=−1。
这样取y的值有一个好处,就是方便定义损失函数。因为正确分类的样本满足yi(w⋅xi+b)||w||>0yi(w⋅xi+b)||w||>0,而错误分类的样本满足yi(w⋅xi+b)||w||<0yi(w⋅xi+b)||w||<0。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小。
所以损失函数定义如下:
其中M集合是误分类点的集合。
不考虑1||w||1||w||,就得到感知机模型的损失函数:
二、BP神经网络
1.BP神经网络流程
神经网络的基本组成单元是神经元。神经元的通用模型如图所示,其中常用的激活函数有阈值函数、sigmoid函数和双曲正切函数。

神经元的输出为:

神经网络是将多个神经元按一定规则联结在一起而形成的网络,如图 所示。
从图 可以看出,一个神经网络包括输入层、隐含层(中间层)和输出层。输入层神经元个数与输入数据的维数相同,输出层神经元个数与需要拟合的数据个数相同,隐含层神经元个数与层数就需要设计者自己根据一些规则和目标来设定。在深度学习出现之前,隐含层的层数通常为一层,即通常使用的神经网络是3层网络。
2.神经网络的公式
2.1.输出层到隐藏层:
αh=∑i=1dvih∗xi⋯⋯⋯⋯⋯⋯⋯(1)
αh=∑i=1dvih∗xi⋯⋯⋯⋯⋯⋯⋯(1)
|x1x2x3⋯xd|⋅∣∣∣∣∣∣∣∣∣v11v21⋅⋅⋅vd1v12v22⋅⋅⋅wd2v13v23⋅⋅⋅wd3⋯⋯⋅⋅⋅⋯v1qw2q⋅⋅⋅wdq∣∣∣∣∣∣∣∣∣
|x1x2x3⋯xd|⋅|v11v12v13⋯v1qv21v22v23⋯w2q⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅vd1wd2wd3⋯wdq|
2.2.经过隐藏层的激活函数:
bh=f(αh−γh)⋯⋯⋯⋯⋯⋯⋯(2)
bh=f(αh−γh)⋯⋯⋯⋯⋯⋯⋯(2)
2.3.隐藏层到输出层:
βj=∑h=1qwhj∗bh⋯⋯⋯⋯⋯⋯⋯(3)
βj=∑h=1qwhj∗bh⋯⋯⋯⋯⋯⋯⋯(3)
用矩阵表示
|b1b2b3⋯bq|⋅∣∣∣∣∣∣∣∣∣w11w21⋅⋅⋅wq1w12w22⋅⋅⋅wq2w13w23⋅⋅⋅wq3⋯⋯⋅⋅⋅⋯w1lw2l⋅⋅⋅wql∣∣∣∣∣∣∣∣∣
|b1b2b3⋯bq|⋅|w11w12w13⋯w1lw21w22w23⋯w2l⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅wq1wq2wq3⋯wql|
2.4.经过输出层的激活函数:
yk,j=f(βj−θj)⋯⋯⋯⋯⋯⋯⋯(4))
yjk,=f(βj−θj)⋯⋯⋯⋯⋯⋯⋯(4))
2.5.误差:
Ek=12∑j=1l(yk,j−ykj)2⋯⋯⋯⋯⋯⋯⋯(5)
Ek=12∑j=1l(yjk,−yjk)2⋯⋯⋯⋯⋯⋯⋯(5)
综上我们可以得知whjwhj先影响βjβj,再影响yk,jyjk,,最后影响EkEk,(一个ww权值只会影响一个ββ)所以我们可得:
Δwhj=−η∂Ek∂whj=−η∂Ek∂yk,j⋅∂yk,j∂βj⋅∂βj∂whj⋯(6)
Δwhj=−η∂Ek∂whj=−η∂Ek∂yjk,⋅∂yjk,∂βj⋅∂βj∂whj⋯(6)
其中∂βj∂whj=bh∂βj∂whj=bh,前面提到过,bhbh是第h个隐藏神经元的输出。
gj=∂Ek∂yk,j⋅∂yk,j∂βj=(yk,j−ykj)⋅f′(βj−θj)⋯(7)
gj=∂Ek∂yjk,⋅∂yjk,∂βj=(yjk,−yjk)⋅f′(βj−θj)⋯(7)
而我们选择的激活函数是SigmodSigmod函数,该函数具有一个很好的性质
f(x)=11+e−x⋯f′(x)=f(x)(1−f(x))⋯(8)
f(x)=11+e−x⋯f′(x)=f(x)(1−f(x))⋯(8)
所以我们有:
f′(βj−θj)=f(βj−θj)⋅(1−f(βj−θj))=yk′j⋅(1−yk′j)⋯(9)
f′(βj−θj)=f(βj−θj)⋅(1−f(βj−θj))=yjk′⋅(1−yjk′)⋯(9)
综合formula(6)(7)(9)formula(6)(7)(9)我们可得:
Δwhj=−η∂Ek∂whj=−ηgibh=−η(yk′j−ykj)⋅yk′j⋅(1−yk′j)⋅bh⋯(10)
Δwhj=−η∂Ek∂whj=−ηgibh=−η(yjk′−yjk)⋅yjk′⋅(1−yjk′)⋅bh⋯(10)
同理:
Δθj=−η∂Ek∂θj=−η∂Ek∂yk′j⋅∂yk′j∂θj=η⋅gj⋯(11)
Δθj=−η∂Ek∂θj=−η∂Ek∂yjk′⋅∂yjk′∂θj=η⋅gj⋯(11)
我们再看看ΔvihΔvih的值怎么求,还是由formula(1),(2),(3),(4),(5)formula(1),(2),(3),(4),(5)推导,一个vv权值会影响所有的ββ
Δvih=−ηehxi⋯⋯⋯⋯(12)
Δvih=−ηehxi⋯⋯⋯⋯(12)
Δγh=ηeh⋯⋯ ⋯(13)
Δγh=ηeh⋯⋯ ⋯(13)
其中
eh=(∑j=1l∂Ek∂βj⋅∂βj∂bj)⋅f′(αh−γh)=(∑j=1l(yk,j−ykj)⋅f′(βj−θj)⋅whj)⋅f′(αh−γh)⋯⋯⋯(14)
三、感知器神经网络的构建
% 1.1 生成网络
net=newp([0 2],1);%单输入,输入值为[0,2]之间的数
inputweights=net.inputweights{1,1};%第一层的权重为1
biases=net.biases{1};%阈值为1
% 1.2 网络仿真
net=newp([-2 2;-2 2],1);%两个输入,一个神经元,默认二值激活
net.IW{1,1}=[-1 1];%权重,net.IW{i,j}表示第i层网络第j个神经元的权重向量
net.IW{1,1}
net.b{1}=1;
net.b{1}
p1=[1;1],a1=sim(net,p1)
p2=[1;-1],a2=sim(net,p2)
p3={[1;1] [1 ;-1]},a3=sim(net,p3) %两组数据放一起
p4=[1 1;1 -1],a4=sim(net,p4)%也可以放在矩阵里面
net.IW{1,1}=[3,4];
net.b{1}=[1];
a1=sim(net,p1)
% 1.3 网络初始化
net=init(net);
wts=net.IW{1,1}
bias=net.b{1}
% 改变权值和阈值为随机数
net.inputweights{1,1}.initFcn='rands';
net.biases{1}.initFcn='rands';
net=init(net);
bias=net.b{1}
wts=net.IW{1,1}
a1=sim(net,p1)
% 2. 感知器神经网络的学习和训练
% 1 网络学习
net=newp([-2 2;-2 2],1);
net.b{1}=[0];
w=[1 -0.8]
net.IW{1,1}=w;
p=[1;2];
t=[1];
a=sim(net,p)
e=t-a
help learnp
dw=learnp(w,p,[],[],[],[],e,[],[],[],[],[])
w=w+dw
net.IW{1,1}=w;
a=sim(net,p)
net = newp([0 1; -2 2],1);
P = [0 0 1 1; 0 1 0 1];
T = [0 1 1 1];
Y = sim(net,P)
net.trainParam.epochs = 20;
net = train(net,P,T);
Y = sim(net,P)
% 2 网络训练
net=init(net);
p1=[2;2];t1=0;p2=[1;-2];t2=1;p3=[-2;2];t3=0;p4=[-1;1];t4=1;
net.trainParam.epochs=1;
net=train(net,p1,t1)
w=net.IW{1,1}
b=net.b{1}
a=sim(net,p1)
net=init(net);
p=[[2;2] [1;-2] [-2;2] [-1;1]];
t=[0 1 0 1];
net.trainParam.epochs=1;
net=train(net,p,t);
a=sim(net,p)
net=init(net);
net.trainParam.epochs=2;
net=train(net,p,t);
a=sim(net,p)
net=init(net);
net.trainParam.epochs=20;
net=train(net,p,t);
a=sim(net,p)
% 3. 二输入感知器分类可视化问题
P=[-0.5 1 0.5 -0.1;-0.5 1 -0.5 1];
T=[1 1 0 1]
net=newp([-1 1;-1 1],1);
plotpv(P,T);
plotpc(net.IW{1,1},net.b{1});
%hold on;
%plotpv(P,T);
net=adapt(net,P,T);
net.IW{1,1}
net.b{1}
plotpv(P,T);
plotpc(net.IW{1,1},net.b{1})
net.adaptParam.passes=3;
net=adapt(net,P,T);
net.IW{1,1}
net.b{1}
plotpc(net.IW{1},net.b{1})
net.adaptParam.passes=6;
net=adapt(net,P,T)
net.IW{1,1}
net.b{1}
plotpv(P,T);
plotpc(net.IW{1},net.b{1})
plotpc(net.IW{1},net.b{1})
%仿真
a=sim(net,p);
plotpv(p,a)
p=[0.7;1.2]
a=sim(net,p);
plotpv(p,a);
hold on;
plotpv(P,T);
plotpc(net.IW{1},net.b{1})
%感知器能够正确分类,从而网络可行。
% 4. 标准化学习规则训练奇异样本
P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1.0 50]
T=[1 1 0 0 1];
net=newp([-40 1;-1 50],1);
plotpv(P,T);%标出所有点
hold on;
linehandle=plotpc(net.IW{1},net.b{1});%画出分类线
E=1;
net.adaptParam.passes=3;%passes决定在训练过程中训练值重复的次数。
while (sse(E))
[net,Y,E]=adapt(net,P,T);
linehandle=plotpc(net.IW{1},net.b{1},linehandle);
drawnow;
end;
axis([-2 2 -2 2]);
net.IW{1}
net.b{1}
%另外一种网络修正学习(非标准化学习规则learnp)
hold off;
net=init(net);
net.adaptParam.passes=3;
net=adapt(net,P,T);
plotpc(net.IW{1},net.b{1});
axis([-2 2 -2 2]);
net.IW{1}
net.b{1}
%无法正确分类
%标准化学习规则网络训练速度要快!
% 训练奇异样本
% 用标准化感知器学习规则(标准化学习数learnpn)进行分类
net=newp([-40 1;-1 50],1,'hardlim','learnpn');
plotpv(P,T);
linehandle=plotpc(net.IW{1},net.b{1});
e=1;
net.adaptParam.passes=3;
net=init(net);
linehandle=plotpc(net.IW{1},net.b{1});
while (sse(e))
[net,Y,e]=adapt(net,P,T);
linehandle=plotpc(net.IW{1},net.b{1},linehandle);
end;
axis([-2 2 -2 2]);
net.IW{1}%权重
net.b{1}%阈值
%正确分类
%非标准化感知器学习规则训练奇异样本的结果
net=newp([-40 1;-1 50],1);
net.trainParam.epochs=30;
net=train(net,P,T);
pause;
linehandle=plotpc(net.IW{1},net.b{1});
hold on;
plotpv(P,T);
linehandle=plotpc(net.IW{1},net.b{1});
axis([-2 2 -2 2]);
% 5. 设计多个感知器神经元解决分类问题
p=[1.0 1.2 2.0 -0.8; 2.0 0.9 -0.5 0.7]
t=[1 1 0 1;0 1 1 0]
plotpv(p,t);
hold on;
net=newp([-0.8 1.2; -0.5 2.0],2);
linehandle=plotpc(net.IW{1},net.b{1});
net=newp([-0.8 1.2; -0.5 2.0],2);
linehandle=plotpc(net.IW{1},net.b{1});
e=1;
net=init(net);
while (sse(e))
[net,y,e]=adapt(net,p,t);
linehandle=plotpc(net.IW{1},net.b{1},linehandle);
drawnow;
end;
感知机和BP神经网络的更多相关文章
- 感知机与BP神经网络的简单应用
感知机与神经元 感知机(Perceptron)由两层神经元组成(输入层.输出层),输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic un ...
- (转)神经网络和深度学习简史(第一部分):从感知机到BP算法
深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...
- 感知机算法及BP神经网络
简介:感知机在1957年就已经提出,可以说是最为古老的分类方法之一了.是很多算法的鼻祖,比如说BP神经网络.虽然在今天看来它的分类模型在很多数时候泛化能力不强,但是它的原理却值得好好研究.先学好感知机 ...
- BP神经网络原理及python实现
[废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...
- BP神经网络
秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...
- 极简反传(BP)神经网络
一.两层神经网络(感知机) import numpy as np '''极简两层反传(BP)神经网络''' # 样本 X = np.array([[0,0,1],[0,1,1],[1,0,1],[1, ...
- bp神经网络及matlab实现
本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例 本文以Fisher的Iris数据集 ...
- 神经网络中的BP神经网络和贝叶斯
1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...
- BP神经网络与Python实现
人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...
随机推荐
- IDEA安装及默认配置习惯配置(一)
最新新转战IDEA,每次安装完需要做一些操作习惯的设置,在这里记录一下,下次安装可以快速上手用. 第一步,JAVA安装 JDK官方下载地址:https://www.oracle.com 下载JDK时根 ...
- 关于Vue中页面(父组件)下拉,页面中的子组件加载更多数据的实现方法
一个项目中存在很多这种情况:父组件(页面)中的子组件需要做下拉加载更多的需求,但是这个下拉到底部的动作只能通过监控页面(父组件)来完成 这就需要父子组件之间的通信,代码如下: 1. 建立一个用于父子组 ...
- Android写入文件电脑看不到
原因是因为没有刷新,写入文件后执行以下代码即可. 根目录路径: File newfile = new File(Environment.getExternalStorageDirectory() + ...
- MySQL详细知识点总结
1 Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号 ...
- orecle 查询数量 union合并 的排序问题
orecle 查询数量 union合并 之后按照从小到大排序了,这边需要不排序的 直接将union 改成union all 就解决了. 图就不传了,验证没问题
- Scrapy 中常用的中间件和管道组件
Pipeline用法 储存到MongoDB pipline.py中的代码 import pymongo class MongoPipeline(object): def __init__(self, ...
- Linux下 expect 使用详解与实例
一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expec ...
- FreeRTOS任务基础概念
RTOS系统的核心就是任务管理: 任务的特性 在RTOS中每个任务都有自己的运行环境,不依赖于系统中其他的任务或者调度器,任何一个时间点只能有一个任务运行,具体运行哪个任务是由任务调度器来决定的,而任 ...
- idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制
摘要 使用 Istio 可以很方便地实现微服务间的访问控制.本文演示了使用 Denier 适配器实现拒绝访问,和 Listchecker 适配器实现黑白名单两种方法. 使用场景 有时需要对微服务间的相 ...
- Java8-Lock-No.05
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...