% 单层感知器
%% 1.newp--创建一个感知器
%{
具体用法:
net=newp(P,T,TF,LF);
P: P是一个R×2的矩阵,R为感知器中输入向量的维度,每一行表示输入向量每个分量的取值
范围如P=[-1,1;0,1]表示输入向量是二维向量[x1,x2],且x1∈[-1,1],x2∈[0,1]
T: T表示输出节点的个数,标量
TF: 传输函数,可选hardlim和hardlims,默认为hardlim,建议取hardlims
LF: 学习函数,可选learnp或learnpn,默认为learnp,learnpn对输入量大小的变化不明显,
当输入的向量在数值的幅度上变化较大用learnpn代替learnp可以加快计算速度
%}
%举个栗子:用newp函数创建一个感知器并进行训练仿真
p=[-1,1;-1,1];
t=1;
net=newp(p,t,'hardlim','learnp');
P=[0,0,1,1;0,1,0,1]; % 用于训练的输入数据,每列为一个输入向量
T=[0,1,1,1]; % 输入数据的期望输出
[net,tr]=train(net,P,T); %train用于训练
newP=[0,0.9]'; %第一个测试数据
newT=sim(net,newP); %第一个测试数据的输出结果
newP2=[0.9,0.9]';
newT2=sim(net,newP2);
%% 2.train--训练感知器网络
%{
具体用法:
[net,tr]=train(net,P,T,Pi,Ai); % train函数用来训练创建好的感知器网络
输入:
net: 需要训练的神经网络,此处为newp函数的输出.
train根据net.trainFcn和net.trainParam进行训练
P: 网络输入.P为R×Q的输入矩阵,每一列为一个输入向量,
R等于网络的输入节点个数,共有Q个训练输入向量
T: 期望输出.可选参数,不选默认全为0,T为S×Q矩阵,每一列为一个输出向量,
S等于输出节点个数,共有Q个输出,Q为输入向量的个数
Pi: 初始输入延迟,默认为0
Ai: 初始的层延迟,默认为0
输出:
net: 训练好的网络
tr: 训练记录,包括训练的步数epoch核性能perf
%}
% 举个栗子:创建一个感知器,用来判断输入数字的符号,如果≥0输出1,<0输出0
p=[-1000,1000];
t=1;
net=newp(p,t);
P=[-5,-4,-3,-2,-1,0,1,2,3,4];
T=[0,0,0,0,0,1,1,1,1,1];
net=train(net,P,T);
newP=-10:.2:10;
newT=sim(net,newP);
plot(newP,newT,'LineWidth',3);
title('判断数字符号的感知器');
%% 3.sim--对训练好的网络进行仿真
%{
具体用法1: [Y,Pf,Af]=sim(net,P,Pi,Ai) % sim函数用于仿真一个神经网络
具体用法2: [Y,Pf,Af,E,perf]=sim(...)
输入:
net: 训练好的神经网络
P: 网络的输入,每一列一个输入向量
Pi: 网络的初始输入延迟,默认为0
Ai: 网络的初始层的延迟,默认为0
输出:
Y: 网络对输入P的真实输出
Pf: 最终输出延迟
Af: 最终的层延迟
E: 网络的误差
perf: 网络的性能(Performance)
%}
% 举个栗子:创建感知器,实现逻辑与的功能,用sim仿真
net=newp([-2,2;-2,2],1);
P=[0,0,1,1;0,1,0,1];
T=[0,0,1,1];
net=train(net,P,T);
Y=sim(net,P); %得到仿真结果
Y2=net(P); %另一种得到仿真结果的方式
%% 4.hardlim/hardlims--感知器传输函数
%{
hardlim核hardlims都是感知器的传输函数
hardlim(x):返回1如果x>=0,返回0如果x<0
hardlims(x):返回1如果x>=0,返回-1如果x<0
newp函数中默认采用hardlim函数.如果要采用hardlims,net=newp(P,T,'hardlims')
%}
%% 5.init--神经网络初始化函数
%{
具体用法: net=init(net)
init函数用来初始化神经网络net的权值和阈值
%}
% 举个栗子:观察感知器网络权值的变化
net=newp([0,1;-2,2],1);
net.iw{1,1} % 创建时的权值
net.b{1} % 创建时的偏置
P=[0,1,0,1;0,0,1,1];
T=[0,0,0,1];
net=train(net,P,T);
net.iw{1,1}
net.b{1}
net=init(net);
net.iw{1,1}
net.b{1}
net.initFcn
net.initParam % 当initFcn为initlay时,initParam自动为空,所以这一行会报错
%% 6.adapt--神经网络的自适应
%{
具体用法: [net,Y,E,Pf,Af,tr]=adapt(net,P,T,Pi,Ai)
输入:
net: 待修正的神经网络
P: 网络的输入
T: 网络的期望输出
Pi: 初始的输入延迟
Ai: 初始的层延迟
输出:
net: 修正后的网络
Y: 网络的输出
E: 网络的误差
Pf: 最终的输出延迟
Af: 最终的层延迟
Tr: 训练记录,包括epoch和perf
参数T仅对需要目标的网络是必需的,Pi Pf Ai Af仅对有输入延迟或层间延迟的网络有意义
%}
%举个栗子:使用adapt函数调整感知器核其他神经网络
net=newp([-1,2;-2,2],1);
P={[0;0] [0;1] [1;0] [1;1]}
T={0,0,1,1}
[net,y,ee,pf]=adapt(net,P,T);
ma=mae(ee) % 误差
ite=0; % 迭代次数初始化
while ma>=0.01
[net,y,ee,pf]=adapt(net,P,T);
ma=mae(ee)
newT=sim(net,P)
ite=ite+1;
if ite>=100
break;
end
end
%adapt函数在线性神经网络中比较常用
%% 7.mae--平均绝对误差性能函数
%{
具体用法: perf=mae(E) %取绝对值再求平均值
其他性能函数: sse:平方再求和 mse:平方再求平均值
%}
clear,clc
net=newp([-20,20;-20,20],1);
P=[-9,1,-12,-4,0,5;15,-8,4,5,11,9];
T=[0,1,0,0,0,1];
net=train(net,P,T);
Y=sim(net,P)
iw=net.iw;
b=net.b;
w=[b{1},iw{1}] %w=[0,14,-6]表示分离直线为7x-3y=0
数据挖掘——单层感知器的Matlab实现
最新推荐文章于 2023-11-13 07:30:57 发布