1. 程式人生 > >資料探勘——單層感知器的Matlab實現

資料探勘——單層感知器的Matlab實現

% 單層感知器

%% 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