資料探勘——單層感知器的Matlab實現
阿新 • • 發佈:2019-02-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,建議取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