【计算智能】-感知器、BP神经网络

本文介绍了计算智能中的两种重要模型——感知机和BP神经网络。首先,详细阐述了感知机的原理,包括感知机形式和算法,接着通过代码展示了感知机的学习和训练过程。然后,讲解了BP神经网络的概念、基本原理,分析了其优缺点,并给出了BP神经网络的构建和训练的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

一.感知机的原理

  感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,分
别取+1和−1二值。如果要处理的数据是线性可分的,则该模型能取得很好的效果,如
果数据不是线性可分的,则该模型不能取得很好的效果。以二维平面为例,如果要分
类 的点,能被一条直线分开,直线的一侧是正类,直线的另一侧是负类,则说明数据
是线性可分的。如果数据需要一个圆来分开则说明数据不是线性可分的。

二.感知机模型

  感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判
别模型。以二维平面为例,假设平面中存在着′∘′′∘′和′×′′×′两种形状的点,感知机要做
的是就是找到一条直线,将两类点分割开,感知机只适合于线性可分的数据,所以它
是一个线性模型。
2.1 感知机形式

感知机就是为了确定一条直线WX+b,让直线的一侧为正类,直线的另一侧是负类。当WX+b运算大于0时为+1,WX+b运算小于0时为-1,为此引入了sign函数.
在这里插入图片描述
假设平面中存在着′∘′和′×′两种形状的点,感知机要做的是就是找到一条直线,将两类点分割开
在这里插入图片描述

*三.感知机算法

3.1 感知机原始算法

输入:训练数据集T=(x1,y1),(x2,y2),…,(xN,yN),yi∈{−1,+1},学习率η(0<η<1)

输出:w,b;感知机模型f(x)=sign(w⋅x+b)

  1. 赋初值 w0,b0
  2. 选取数据点(xi,yi)
  3. 判断该数据点是否为当前模型的误分类点,即判断若yi(w⋅xi+b)<=0则更新
    w=w+ηyixi
    b=b+ηyi
  4. 转到2,直到训练集中没有误分类点

3.2 代码执行

3.2.1. 感知器神经网络的构建

% 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)

运行结果:
ans =

-1     1

ans =

 1

p1 =

 1
 1

a1 =

 1

p2 =

 1
-1

a2 =

 0

p3 =

1×2 cell 数组

{2×1 double}    {2×1 double}

a3 =

1×2 cell 数组

{[1]}    {[0]}

p4 =

 1     1
 1    -1

a4 =

 1     0

a1 =

 1

wts =

 0     0

bias =

 0

bias =

0.6294

wts =

0.8116   -0.7460

a1 =

 1

#### 3.2.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;

运行结果:
w =

1.0000   -0.8000

a =

 0

e =

 1

dw =

 1     2

w =

2.0000    1.2000

a =

 1

Y =

 1     1     1     1

Y =

 0     1     1     1

w =

-2    -2

b =

-1

a =

 0

a =

 0     0     1     1

a =

 0     1     0     1

a =

 0     1     0     1

T =

 1     1     0     1

ans =

-0.5000    0.5000

ans =

-1

ans =

-0.1000    2.0000

ans =

 2

net =

ans =

-0.6000    2.5000

ans =

 1

p =

0.7000
1.2000

P =

-0.5000   -0.5000    0.3000   -0.1000  -40.0000
-0.5000    0.5000   -0.5000    1.0000   50.0000

ans =

-45.0000   10.5000

ans =

-17

ans =

-0.2000   -0.5000

ans =

-2

ans =

 -1.5592   -0.1980

ans =

 0

p =

1.0000    1.2000    2.0000   -0.8000
2.0000    0.9000   -0.5000    0.7000

t =

 1     1     0     1
 0     1     1     0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**

四.BP神经网络

4.1 BP神经网络概念
  BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提
出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广

泛的神经网络。

**

4.2 基本原理
    BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称
  为 BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输     
  出 值和期望输出值的误差均方差为最小。
4.3 计算过程
4.4 劣优势

BP神经网络无论在网络理论还是在性能方面已比较成熟。其突出优点就是具有很强的非线性映射能力和柔性的网络结构。网络的中间层数、各层的神经元个数可根据具体情况任意设定,并且随着结构的差异其性能也有所不同。但是BP神经网络也存在以下的一些主要缺陷。
①学习速度慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛。
②容易陷入局部极小值。
③网络层数、神经元个数的选择没有相应的理论指导。
④网络推广能力有限。

4.5 代码实现

4.5.1 BP神经网络的构建


net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{1}
%p=[1;];
p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{1}
net.b{1}
a=sim(net,p)
net.IW{1}*p+net.b{1}
p2=net.IW{1}*p+net.b{1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{2}
net.b{1}




P=[1.2;3;0.5;1.6]
W=[0.3 0.6 0.1 0.8]
net1=newp([0 2;0 2;0 2;0 2],1,'purelin');
net2=newp([0 2;0 2;0 2;0 2],1,'logsig');
net3=newp([0 2;0 2;0 2;0 2],1,'tansig');
net4=newp([0 2;0 2;0 2;0 2],1,'hardlim');

net1.IW{1}
net2.IW{1}
net3.IW{1}
net4.IW{1}
net1.b{1}
net2.b{1}
net3.b{1}
net4.b{1}


net1.IW{1}=W;
net2.IW{1}=W;
net3.IW{1}=W;
net4.IW{1}=W;

a1=sim(net1,P)
a2=sim(net2,P)
a3=sim(net3,P)
a4=sim(net4,P)

init(net1);
net1.b{1}

help tansig

运行结果:

ans =

1.4249   -0.4581
1.5238    0.3238
-1.0677    0.7283

ans =

-1.9920
-1.5715
-3.7117

a =

-1.2309

ans =

-0.2970   -0.9534
 0.9465    0.7863
-1.2525    0.6132

ans =

4.9570
-2.4390
-3.3316

a =

2.5610

ans =

2.7531
0.0801
-3.3577

p2 =

2.7531
0.0801
-3.3577

a2 =

 1
 1
-1

a3 =

0.7616
0.7616
-0.7616

a4 =

0.7616
0.7616
-0.7616

ans =

0.6983

ans =

4.9570
-2.4390
-3.3316

P =

1.2000
3.0000
0.5000
1.6000

W =

0.3000    0.6000    0.1000    0.8000

ans =

 0     0     0     0

ans =

 0     0     0     0

ans =

 0     0     0     0

ans =

 0     0     0     0

ans =

 0

ans =

 0

ans =

 0

ans =

 0

a1 =

3.4900

a2 =

0.9704

a3 =

0.9981

a4 =

 1

ans =

 0

在这里插入图片描述

4.5.2 训练
p=[-0.1 0.5]
t=[-0.3 0.4]
w_range=-2:0.4:2;
b_range=-2:0.4:2;

ES=errsurf(p,t,w_range,b_range,'logsig');%单输入神经元的误差曲面
plotes(w_range,b_range,ES)%绘制单输入神经元的误差曲面
pause(0.5);
hold off;
net=newp([-2,2],1,'logsig');
net.trainparam.epochs=100;
net.trainparam.goal=0.001;
figure(2);
[net,tr]=train(net,p,t);
title('动态逼近')
wight=net.iw{1}
bias=net.b
pause;
close;


p=[-0.2 0.2 0.3 0.4]
t=[-0.9 -0.2 1.2 2.0]
h1=figure(1);
net=newff([-2,2],[5,1],{'tansig','purelin'},'trainlm');
net.trainparam.epochs=100;
net.trainparam.goal=0.0001;
net=train(net,p,t);
a1=sim(net,p)
pause;
h2=figure(2);
plot(p,t,'*');
title('样本')
title('样本');
xlabel('Input');
ylabel('Output');
pause;
hold on;
ptest1=[0.2 0.1]
ptest2=[0.2 0.1 0.9]
a1=sim(net,ptest1);
a2=sim(net,ptest2);

net.iw{1}
net.iw{2}
net.b{1}
net.b{2}

p =

-0.1000    0.5000

t =

-0.3000    0.4000

wight =

15.1653

bias =

1×1 cell 数组

{[-8.8694]}

p =

-0.2000    0.2000    0.3000    0.4000

t =

-0.9000   -0.2000    1.2000    2.0000

a1 =

-0.9000   -0.1999    1.1999    2.0000

ptest1 =

0.2000    0.1000

ptest2 =

0.2000    0.1000    0.9000

ans =

9.9011
0.0310
1.6399
0.6896
-3.4641

ans =

 []


ans =

-2.5935
-11.5221
-8.2836
17.5030
-7.1754

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值