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

来源:互联网 发布:淘宝详情图片怎么上传 编辑:程序博客网 时间:2024/05/16 06:02
% 单层感知器%% 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,建议取hardlimsLF: 学习函数,可选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:     初始输入延迟,默认为0Ai:     初始的层延迟,默认为0输出:net:    训练好的网络tr:     训练记录,包括训练的步数epoch核性能perf%}% 举个栗子:创建一个感知器,用来判断输入数字的符号,如果≥0输出1,<0输出0p=[-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:         网络的初始输入延迟,默认为0Ai:         网络的初始层的延迟,默认为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<0hardlims(x):返回1如果x>=0,返回-1如果x<0newp函数中默认采用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.initFcnnet.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;    endend%adapt函数在线性神经网络中比较常用%% 7.mae--平均绝对误差性能函数%{具体用法:       perf=mae(E) %取绝对值再求平均值其他性能函数:   sse:平方再求和     mse:平方再求平均值  %}clear,clcnet=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


原创粉丝点击