您的位置:首页 > 编程语言 > MATLAB

数据挖掘——单层感知器的Matlab实现

2017-09-02 22:30 246 查看
% 单层感知器

%% 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: