一、感知机

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。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小

所以损失函数定义如下:

L(w,b)=−1||w||∑xi∈Myi(w⋅xi+b)L(w,b)=−1||w||∑xi∈Myi(w⋅xi+b)

其中M集合是误分类点的集合。

不考虑1||w||1||w||,就得到感知机模型的损失函数:

L(w,b)=−∑xi∈Myi(w⋅xi+b)

二、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神经网络的更多相关文章

  1. 感知机与BP神经网络的简单应用

    感知机与神经元 感知机(Perceptron)由两层神经元组成(输入层.输出层),输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic un ...

  2. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  3. 感知机算法及BP神经网络

    简介:感知机在1957年就已经提出,可以说是最为古老的分类方法之一了.是很多算法的鼻祖,比如说BP神经网络.虽然在今天看来它的分类模型在很多数时候泛化能力不强,但是它的原理却值得好好研究.先学好感知机 ...

  4. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

  5. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  6. 极简反传(BP)神经网络

    一.两层神经网络(感知机) import numpy as np '''极简两层反传(BP)神经网络''' # 样本 X = np.array([[0,0,1],[0,1,1],[1,0,1],[1, ...

  7. bp神经网络及matlab实现

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

  8. 神经网络中的BP神经网络和贝叶斯

    1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...

  9. BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...

随机推荐

  1. Android高版本收不到静态注册的广播

    Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-de ...

  2. HttpResponse与JasonResponse

    两者的含义 我们都知道后台给前台返回的数据都是字符串类型,那么怎么返回成为一个问题 HttpResponse与JasonResponse都是django中后台给前台返回数据的方法, 并且他们最后走的都 ...

  3. 用<audio>标签打造一个属于自己的HTML5音乐播放器

    上一章节,我们刚刚讲了<video>标签,今晚,我们讲的是<audio>标签,这两个东东除了表示的内容不一样以外,其他的特性相似的地方真的太多了,属性和用法几乎一样,也就说,如 ...

  4. 如何在阿里云上运行SAP UI5应用

    本来Jerry觉得这个知识点太简单了完全不值得写成微信公众号文章,但转念一想,可能网络上有一些刚刚初学UI5的朋友们可能会问到,所以还是写了. 今天一个成都同事问我这个问题,因为SAP WebIDE可 ...

  5. Vue.js面试题整理(转载)

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  6. IMSI-catcher:可发现附近手机敏感信息的工具

      严正声明:该工具主要是为了让大家更好的了解GSM网络的工作原理而设计开发的,请不要用于恶意目的! 前言 IMSI-catcher是一个可以帮助你发现附近手机的IMSI号码,国家,品牌和运营商等信息 ...

  7. Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法

      单元测试代码:  ( 在IDEA中先输入'@Test '然后根据提示进行自动修订即可!!运行时直接运行即可! 若有多个单元测试块的时候,直接把鼠标放在哪里就自动在哪里运行那个单元块) import ...

  8. 操作系统-chapter1

    课程:https://mooc.study.163.com/learn/1000002004?tid=2402971010&_trace_c_p_k2_=f79694c7fc04429bb9b ...

  9. 直接插入排序Straight_Insertion_Sort

    基本思想:简单排序的一种.如果玩过扑克牌应该都知道顺子,这时有一把顺子但是顺序是乱的,你要去按顺序整理.那第二张牌和第一张牌比较,调整顺序后前两张牌就是有序的,接着第三张牌插入前两张的有序列中,形成三 ...

  10. 基于Kinect 2.0深度摄像头的三维重建

    刚今天验收的实验,记录一下. 是比较基础的三维重建内容. 算是三维重建入门. 系统:windows 环境:visual studio 2013 语言:c++ 相关:OpenCV 2.Kinect SD ...