鲁棒学习:L1约束的Huber损失最小化

clear; clc;
n = 50; 
N = 1000; 
x = linspace(-3, 3, n)'; 
X = linspace(-3, 3, N)';
pix = pi*x; 
rng('default');
y = sin(pix) ./ pix + 0.1*x + 0.05*randn(n,1);
y(n / 2)=-0.5;
hh = 2*0.3^2; 
lam = 0.1;   % 正则化参数
e = 0.1;    % 阈值
t0 = randn(n, 1);  % 初始值
x2 = x .^ 2;
k = exp(-(repmat(x2, 1, n) + repmat(x2', n, 1) - 2*(x*x')) / hh);
for o = 1 : 1000
  r = abs(k*t0 - y);   % 残差
  w = ones(n, 1); 
  w(r > e) = e ./ r(r > e);  % Huber损失最小化
  Z = k*(repmat(w, 1, n) .* k) + lam*pinv(diag(abs(t0)));  % L1约束
  t = (Z + 0.000001*eye(n)) \ (k*(w.*y));   % 在Z的对角元中加一个小量使其稳定
  if norm(t - t0) < 1e-3
      break
  end
  t0 = t;
end
K = exp(-(repmat(X .^ 2, 1, n) + repmat(x2', N, 1) - 2*X*x') / hh);
F = K*t;
hold on; 
axis([-2.8 2.8 -1 1.5]);
plot(X, F, 'g', 'LineWidth', 2); 
plot(x, y, 'ob', 'LineWidth', 2);
hold off

猜你喜欢

转载自blog.csdn.net/u012366767/article/details/81564622