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)