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
鲁棒学习:L1约束的Huber损失最小化
猜你喜欢
转载自blog.csdn.net/u012366767/article/details/81564622
今日推荐
周排行