感知器神经网络_MATLAB

1.感知器神经网络介绍

1.1概念

  • 感知器是一种前馈神经网络,具有分层结构; 信息从输入层进入网络,逐层向前传递到输出层;
  • 感知器神经网络是从MP网络发展而来,实际上是线性阙值组成的网络,在MP基础上加上学习功能,使其权值可以调节;

MP模型: https://blog.csdn.net/be_racle/article/details/114795300

1.2 感知器分类

  • 单层感知器
  • 多层感知器

2.单层感知器

2.1概念

单层感知器是最简单的一种人工神经网络结构,包含输入层和输出层。输入层只负责接受外部信息,每个输入节点接收一个输入信号。输出层也称为处理层,具有信息处理能力以及向外部输出处理信息。
在这里插入图片描述
网络中有S个感知器神经元,R个输入元素,W为S*R权值矩阵。输出层第i个神经元的输出为
在这里插入图片描述

原文链接https://blog.csdn.net/weixin_42985978/article/details/123602541

3.多层

4.感知器神经网络训练函数

显示函数
函数名功能说明
plotpv显示函数绘制感知器的输入向量和目标向量
plotpc显示函数绘制分界线
clear all;
%定义输入向量和目标函数
P = [0 0 1 1;0 1 0 1]
T = [0 0 0 1]
plotpv(P,T)
title('向量类别')

plotpv_test
P =
0 0 1 1
0 1 0 1
T =
0 0 0 1

在这里插入图片描述

clear all;
%定义输入向量和目标函数
P = [0 0 1 1;0 1 0 1]
T = [0 0 0 1]
plotpv(P,T) %绘制向量

net = newp(minmax(P),1) %创建一个感知网络
%设定全职
net.iw{1,1} = [-1.2,-0.5];%获取w1值
net.b{1} = 1;%我们的目的实际上是为了获得直线(x1*w1+b=0)
plotpc(net.iw{1,1},net.b{1})
title('向量类别')

在这里插入图片描述

单层感知器神经网络函数:

函数名功能说明
newp设计创建一个感知网络NEW Perceptron
train训练
sim仿真simulate
clear all;
p = [0 1;-2 2]
t=1;

%创建一个单层感知器(NEW Perceptron)
%它有两个输入节点(假设为x1和x2),x1的取值范围是0~1,x2的取值范围是-2~2,输出有一个节点。
net = newp(p,t);

P = [0 0 1 1; 0 1 0 1];%输入样本,在这里是一个2X4的矩阵,矩阵的每一列表示一个样本点
T = [0 1 1 1];%期望值(输出值),对应输入样本
Y = net(P)

%net是已经创建的神经网络
%它本质上是一个对象,在这里修改trainParam的epochs值为20,表示训练最大的迭代次数为20次
net.trainParam.epochs = 20;

net = train(net,P,T);%训练神经网络
Y = net(P)

%以下为理解‘单层感知器’而做的可视化部分,非求解问题必须代码
Y = sim(net,P);%对训练好的神经网络仿真(simulate),把样本值传入神经网络,观察输出结果于原结果是否一致
b = net.b{1,1}; %我们的目的实际上是为了获得直线(x1*w1+x2*w2+b=0),这里获取b值(它存储在net对象的b参数值里)
w1 = net.IW{1,1}(1); %获取w1值
w2 = net.IW{1,1}(2); %获取w2值

% 绘图
x1 = -1:0.1:2;
x2 = -w1/w2*x1-b;
plot(x1,x2,'k')
hold on
plot(P(1,2:end),P(2,2:end),'ko');
plot(P(1,1),P(2,1),'r*');
axis([-1,2,-1,2])
legend('分类直线','值为1','值为0')

在这里插入图片描述
在这里插入图片描述
算法实现

n=0.2; % 学习率

w=[0,0,0];

P = [0 0 1 1; 0 1 0 1];

d=[0 1 1 1]; % 期望输出

P=[ones(1,4);P];

MAX=20; % 最大迭代次数为20次

i=0;

while 1

v=w*P;

x2=hardlim(v); % 实际输出

%更新

e=(d-x2);

ee(i+1)=mae(e);

if (ee(i+1)<0.001) % 判断

disp('we have got it:');

disp(w);

break;

end

% 更新权值和偏置

w=w+n*(d-x2)*P';

if (i>=MAX) % 达到最大迭代次数,退出

disp('MAX times loop');

disp(w);

disp(ee(i+1));

break;

end

i= i+1;

end

figure;

subplot(2,1,1); % 显示待分类的点和分类结果

plot(P(2,2:end),P(3,2:end),'ko');

hold on

plot(P(2,1),P(3,1),'r*');

axis([-1,2,-1,2])

x1=-1:.1:2;

x2=x1*(-w(2)/w(3))-w(1)/w(3);

plot(x1,x2);

legend('值为1','值为0','分类直线');

hold off

subplot(2,1,2); % 显示mae值的变化

x1=0:i;

plot(x1,ee,'o-');

s=sprintf('mae的值(迭代次数:%d)', i+1);

title(s)

在这里插入图片描述

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值