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