之前介绍了,使用Huber损失函数可以实现鲁棒学习,相当于L1约束和L2约束的一个组合。在实现的过程中,Huber损失最小化学习的解是通过加权最小二乘学习法的反复迭代求得的,Huber学习法有一个缺点就是其权重即使对于大的残差也不会变为零。
我们之前也介绍过,L1约束的最小二乘学习的解是通过一般化L2约束的最小二乘学习的反复迭代而求得的。也就是说,Huber学习和L2约束的最小二乘学习的求解方法都是最小二乘法的反复迭代。因此,把它们优化组合在一起,可以得到更好的效果。代码如下:
clear; closeall; clc;
n = 50;% 训练样本个数
N = 1000;% 测试样本个数
x = linspace(-3,3,n)';
X = linspace(-3,3,N)';
pix = pi*x;
y = sin(pix)./pix + 0.1*x + 0.2*randn(n,1);% 拟合的函数
x2 = x.^2;
X2 = X.^2;
hh = 2*0.3^2;
l = 0.1;
e = 0.1;
t0 = rand(n,1);
x2 = x.^2;
k = exp(-(repmat(x2,1,n) + repmat(x2',n,1) - 2*x*x')/hh);
foro = 1:1000
r = abs(k*t0 - y);% 残差
w = ones(n,1);
w(r>e) = e./r(r>e);
Z = k*(repmat(w,1,n).*k) + l*pinv(diag(abs(t0)));
t = (Z + 0.000001*eye(n))\(k*(w.*y));
ifnorm(t-t0)
break;
end
t0 = t;
end
K = exp(-(repmat(X2,1,n) + repmat(x2',N,1) - 2*X*x')/hh);
F = K*t;
lambda = 0.1;
tt = (k^2 + lambda*eye(n))\(k*y);
F2 = K*tt;
plot(X,F,'r-','linewidth',2);
hold on
plot(X,F2,'g-','linewidth',2);
plot(x,y,'bo','linewidth',2);
axis([-2.8,2.8,-0.7,1.7]);
legend('L_1 Consttrained Huber LS','L_2 Consttrained LS','Training Samples');
运行结果如下:
以上就是今天推送的内容,欢迎讨论。
领取专属 10元无门槛券
私享最新 技术干货