HK算法原理及MATLAB實現
一、編程原理
說明:
1、綠色框圖中,當alpha取為最優權向量時,會使
取為最小值。arg的意思是當后面那個函數滿足時,取出它的自變量的值。
2、注意后面那個式子是對b求偏導
3、e(t)大于0時,下式為2*e(t) ; e(t)小于0時,下式為0.
所以b要么不更新,要么就是加一個正數,因此bi>0
二、編程實現
clc;
close all;
clear;load('data.mat');%% 線性樣本
w2_data_nega=-w2_data(:,:); % 矩陣增廣化
Y=[w1_data;w2_data_nega]; %% 權向量和學習率賦值
b2=ones(200,1)+[zeros(1,100),0.1*ones(1,100)]';
b3=ones(200,1)+[0.1*ones(1,100),zeros(1,100)]';
b=[ones(200,1),b2,b3];
r=[0.1,0.2,0.3];for i=1:3for j=1:3%% Y_=(Y'*Y)\Y';
a=Y_*b(:,i);
e=Y*a-b(:,i);%%delta=r(j)*(e+abs(e));
flag=1; % flag為循環標志
N=length(b(:,i));
C=0;
n='Linear'; % n用來記錄是否為線性%%
while(flag)zenum_positive=0;zenum_negative=0;nenum=0;penum=0; % zenum_positive大于零的零的個數 zenum_negative小于零的零的個數 nenum復數個數 penum正數個數for k=1:Nif(e(k)<1e-5 && e(k)>0)zenum_positive=zenum_positive+1;elseif (e(k)>-(1e-5) && e(k)<0)zenum_negative=zenum_negative+1;elseif (e(k)<0)nenum=nenum+1;elsepenum=penum+1;end endendendif((zenum_positive+zenum_negative-N)==0)%%all is 0flag=0;elseif((zenum_positive+penum-N)==0) %%all is 0 or larger than 0flag=0; elseif ((zenum_negative+nenum-N)==0)%%all is 0 or less than 0flag=0;n='Non-Linear!';break;elseC=C+1;a=a+Y_*delta;b(:,i)=b(:,i)+delta;e=Y*a-b(:,i);delta=r(j)*(e+abs(e));endendend
end%% 畫圖x1=(-4:0.1:4);
if abs(a(2))<0.0000001x1=-a(3)/a(1);x2=(-1:0.1:1);x1=ones(length(x2))*x1;
elsex2=(a(1)*x1+a(3))/(-a(2));
end
subplot(3,3,3*(i-1)+j);
hold on;plot(x1,x2,'LineWidth',1);
hold on;plot(w1_data(:,1),w1_data(:,2),'ro','LineWidth',1);
hold on;plot(w2_data(:,1),w2_data(:,2),'b^','LineWidth',1);
title( n,['初始權向量為 b','(',num2str(i),')',' 學習率為 ',num2str(r(j))],'color','blue');end
end