正则化实现降噪,分别使用最小二乘、定步长梯度下降和回溯法的梯度下降求解最优解

正则化实现降噪,分别使用最小二乘、定步长梯度下降和回溯法的梯度下降求解最优解

在这里插入图片描述

原创文章!转载需注明来源:©️ Sylvan Ding’s Blog ❤️

实验目的

参考 INTRODUCTION TO NONELINEAR OPTIMIZATION. Amir Beck. 2014 的 3.4 Denoising 相关内容,分别使用 最小二乘法、定步长的梯度下降(constant)和回溯法的梯度下降(backtracking),实现对 Example 3.4 中带有噪声信号的降噪过程,对比分析采用不同方法的降噪效果。添加不同的噪声,或以不同的方式添加噪声,观察上述三种降噪方法的降噪效果,并简要分析结果。了解并掌握最小二乘法和惩罚问题(Penalized Problem),学会使用MATLAB求解并分析相关问题。

实验环境

MATLAB R2021a

实验内容

考虑一段信号 x ∈ R 300 x\in \mathbb{R}^{300} xR300 ,在该信号上添加一段高斯加性噪声( μ = 0 , σ = 0.05 \mu=0, \sigma=0.05 μ=0,σ=0.05)得到 b b b,由下述MATLAB语句生成。要求使用正则化的最小二乘(RLS)、定步长的梯度下降、回溯法的梯度下降分别对加噪后对信号 b b b 进行降噪处理,并分析各方法降噪效果的优劣。

t=linspace(0,4,300)';
x=sin(t)+t.*(cos(t).^2);
randn('seed',314);
b=x+0.05*randn(300,1);

真实信号与噪声信号的对比图

subplot(1,2,1);
plot(1:300,x,'LineWidth',2);
subplot(1,2,2);
plot(1:300,b,'LineWidth',2);

在这里插入图片描述

算法描述

降噪问题的一般表述为:给定含有噪声的信号 b b b,找到一个“足够好”的估计值 x ∗ x^* x,使得 x ∗ ≈ b x^*\approx b xb,即 x ∗ = arg ⁡ min ⁡ x ∥ x − b ∥ 2 x^* = \arg \min \limits_{x} \Vert x-b \Vert ^2 x=argxminxb2. 显然,这个优化问题的解是 x ∗ = b x^*=b x=b。然而,这一最优解是没有意义的,即产生了过拟合的解。

因此,为了解决过拟合的问题,我们需要向目标函数中添加正则化项。不妨假设,最初的信号是一段光滑的曲线,那么,向量 x x x 相邻两元素间的的差值也应当尽可能的小(接近于0但不等于0). 这样,正则化项就应当选用二次惩罚(Quadratic Penalty),即 R ( x ) = ∑ i = 1 n − 1 ( x i − x i + 1 ) 2 , n = 300 R(x)=\sum^{n-1}_{i=1} (x_i-x_{i+1})^2, n=300 R(x)=i=1n1(xixi+1)2,n=300. 也可以用更加紧凑的向量形式表示: R ( x ) = ∥ L x ∥ 2 , L ∈ R ( n − 1 ) × n , n = 300 R(x)=\Vert Lx \Vert ^2, L\in \mathbb{R}^{(n-1)\times n}, n=300 R(x)=Lx2,LR(n1)×n,n=300,

L = [ 1 − 1 0 0 ⋯ 0 0 0 1 − 1 0 ⋯ 0 0 0 0 1 − 1 ⋯ 0 0 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 0 0 0 0 ⋯ 1 − 1 ] L= \begin{bmatrix} 1 & -1 & 0 & 0 & \cdots & 0 &0 \\ 0 & 1 & -1 & 0 & \cdots & 0 & 0\\ 0 & 0 & 1 & -1 & \cdots & 0 & 0\\ \vdots & \vdots & \vdots & \vdots & & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & 1 & -1 \end{bmatrix} L=100011000110001000010001

所以,最终的目标函数变为 x ∗ = arg ⁡ min ⁡ x ∥ x − b ∥ 2 + λ ∥ L x ∥ 2 , λ > 0 x^* = \arg \min \limits_{x} \Vert x-b \Vert ^2+\lambda \Vert Lx \Vert ^2, \lambda>0 x=argxminxb2+λLx2,λ>0. 其中, λ \lambda λ 为正则化参数(又称惩罚系数), λ \lambda λ 越大,惩罚力度越强, x ∗ x^* x 越“平滑”,反之亦然。当 λ = 0 \lambda=0 λ=0 时,问题转化为一般的最小二乘问题(LS),也就会产生上述无意义的最优解。

最小二乘解

x ∗ ( λ ) = arg ⁡ min ⁡ x { f ( x ) ≡ x T ( I + λ L T L ) x − 2 b T x + ∥ b ∥ 2 } x^*(\lambda) = \arg \min \limits_{x} \left \{ f(x) \equiv x^T \left ( I+\lambda L^T L \right )x -2b^Tx + \Vert b \Vert ^2 \right \} x(λ)=argxmin{f(x)xT(I+λLTL)x2bTx+b2}

显然,目标函数 f ( x ) f(x) f(x) 是一个二次函数,而且必然有 ∇ 2 f ( x ) = 2 ( I + λ L T L ) ≻ 0 \nabla ^2f(x)= 2\left (I+\lambda L^T L\right ) \succ0 2f(x)=2(I+λLTL)0,因此,由定理 2.41 可知,该函数的任何驻点都是全局最小点。驻点满足 ∇ f ( x ) = 0 \nabla f(x)=0 f(x)=0,即 ( I + λ L T L ) x = b \left ( I+\lambda L^T L \right )x=b (I+λLTL)x=b,所以最优解 x ∗ ( λ ) = ( I + λ L T L ) − 1 b x^*(\lambda) = \left ( I+\lambda L^T L \right )^{-1}b x(λ)=(I+λLTL)1b.

梯度下降

目标函数: f ( x ) = x T ( I + λ L T L ) x − 2 b T x + ∥ b ∥ 2 f(x) = x^T \left ( I+\lambda L^T L \right )x -2b^Tx + \Vert b \Vert ^2 f(x)=xT(I+λLTL)x2bTx+b2

目标函数的梯度: g ( x ) = ∇ f ( x ) = ( I + λ L T L ) x − b g(x)=\nabla f(x)=\left ( I+\lambda L^T L \right )x-b g(x)=f(x)=(I+λLTL)xb

梯度下降算法描述

设定 ϵ \epsilon ϵ

初始化 x 0 = 0 , x 0 ∈ R n , n = 300 x_0=0, x_0\in \mathbb{R}^n, n=300 x0=0,x0Rn,n=300

FOR k = 0, 1, 2, …

  1. 选取下降方向 d k = g ( x k ) d_k=g(x_k) dk=g(xk)
  2. 选取步长 t k t_k tk,使得 f ( x k + t k d k ) < f ( x k ) f(x_k+t_kd_k)<f(x_k) f(xk+tkdk)<f(xk)
  3. 设置 x k + 1 = x k + t k d k x_{k+1}=x_k+t_kd_k xk+1=xk+tkdk
  4. IF ∥ g ( x k + 1 ) ∥ ≤ ϵ \Vert g(x_{k+1}) \Vert \le \epsilon g(xk+1)ϵ THEN STOP;

在算法循环的 2. 步长选取中,对于定步长的梯度下降来说, t k t_k tk 为一常量,即 t k = t ˉ t_k=\bar{t} tk=tˉ. 而对于采用回溯法的非精确线搜索来说,令步长的初值 t k = s , s > 0 t_k=s, s>0 tk=s,s>0,更新步长 t k ← β t k , β ∈ ( 0 , 1 ) t_k \gets \beta t_k, \beta \in (0,1) tkβtk,β(0,1),直到满足 f ( x k ) − f ( x k + t k d k ) ≥ − α t k ∇ f ( x k ) T d k , α ∈ ( 0 , 1 ) f(x_k)-f(x_k+t_kd_k)\ge -\alpha t_k\nabla f(x_k)^Td_k, \alpha \in (0,1) f(xk)f(xk+tkdk)αtkf(xk)Tdk,α(0,1),可以证明,当 t ∈ [ 0 , ϵ ] t\in [0,\epsilon] t[0,ϵ],上述不等式总成立。

实验步骤

% 生成L
L=zeros(299,300);
for i=1:299
	L(i,i)=1;
	L(i,i+1)=-1;
end
function draw_pic(x,b,optimum,lambda,pic_title)
% 绘图函数
% 输入:
% x是不含噪声的源信号
% b是含有噪声的原信号
% optimum的每列是对原信号b降噪后的一个解
% lambda是选用的正则化惩罚因子
% pic_title是图片的标题
color_prism=colormap(prism);
plot(1:300,b,'LineWidth',1,'DisplayName','signal with noise',...
    'Color',color_prism(1,:));
hold on
plot(1:300,x,'LineWidth',0.7,'DisplayName','signal without noise',...
    'Color','b');
[~,sz]=size(optimum);
for j=1:sz
    p=plot(1:300,optimum(:,j),'LineWidth',0.8,'DisplayName',...
        ['denoised signal with \lambda=',num2str(lambda(j)),...
        ', SSE=',num2str(norm(optimum(:,j)-x)^2)],...
        'Color',color_prism(2*j,:));
    p.Color(4)=0.5; % set transparent
end
hold off
xlim([0 300])
ylim([-0.5 3.5])
legend('Location','northwest')
title(pic_title)

最小二乘

lambda=[1 10 100 1000];
x_rls=[];
for l=lambda
	x_rls=[x_rls,(eye(300)+l*L'*L)\b];
end
draw_pic(x,b,x_rls,lambda,'RLS solutions')

定步长梯度下降

lambda=[0.5 5 50];
x0=zeros(300,1);
t=0.005;
eps=5;
x_constgd=[];
for l=lambda
    f=@(x) x'*(eye(300)+l*L'*L)*x-2*b'*x+norm(b)^2;
    g=@(x) (eye(300)+l*L'*L)*x-b;
    [x_constgd_next,~]=...
    	gradient_method_constant(f,g,x0,t,eps);
    x_constgd=[x_constgd,x_constgd_next];
end
draw_pic(x,b,x_constgd,lambda,[...
	'GMC solutions, t=',num2str(t),...
	'x_0=(0,0,\dots)',...
	' \epsilon=',num2str(eps)])
function [x,fun_val]=gradient_method_constant(f,g,x0,t,epsilon)
% Gradient method with constant stepsize
%
% INPUT
%=======================================
% f ......... objective function
% g ......... gradient of the objective function
% x0......... initial point
% t ......... constant stepsize
% epsilon ... tolerance parameter
% OUTPUT
%=======================================
% x ......... optimal solution (up to a tolerance)
% of min f(x)
% fun_val ... optimal function value
x=x0;
grad=g(x);
iter=0;
while (norm(grad)>epsilon)
	iter=iter+1;
	x=x-t*grad;
	fun_val=f(x);
	grad=g(x);
	fprintf('iter_number = %3d norm_grad = %2.6f fun_val = %2.6f \n',...
		iter,norm(grad),fun_val);
end

回溯法梯度下降

lambda=[0.1 5 50];
x0=zeros(300,1);
s=0.1;
alpha=0.5;
beta=0.3;
eps=0.7;
x_constgd=[];
for l=lambda
    f=@(x) x'*(eye(300)+l*L'*L)*x-2*b'*x+norm(b)^2;
    g=@(x) (eye(300)+l*L'*L)*x-b;
    [x_constgd_next,~]=...
    	gradient_method_backtracking(f,g,x0,s,alpha,beta,eps);
    x_constgd=[x_constgd,x_constgd_next];
end
draw_pic(x,b,x_constgd,lambda,[...
	'GMB solutions, s=',num2str(s),...
	' x_0=(0,0,...)',...
	' \alpha=',num2str(alpha),...
	' \beta=',num2str(beta),...
	' \epsilon=',num2str(eps)])
function [x,fun_val]=gradient_method_backtracking(f,g,x0,s,alpha,...
beta,epsilon)
% Gradient method with backtracking stepsize rule
%
% INPUT
%=======================================
% f ......... objective function
% g ......... gradient of the objective function
% x0......... initial point
% s ......... initial choice of stepsize
% alpha ..... tolerance parameter for the stepsize selection
% beta ...... the constant in which the stepsize is multiplied
% at each backtracking step (0<beta<1)
% epsilon ... tolerance parameter for stopping rule
% OUTPUT
%=======================================
% x ......... optimal solution (up to a tolerance)
% of min f(x)
% fun_val ... optimal function value
x=x0;
grad=g(x);
fun_val=f(x);
iter=0;
while (norm(grad)>epsilon)
	iter=iter+1;
	t=s;
	while (fun_val-f(x-t*grad)<alpha*t*norm(grad)^2)
		t=beta*t;
	end
	x=x-t*grad;
	fun_val=f(x);
	grad=g(x);
	fprintf('iter_number = %3d norm_grad = %2.6f fun_val = %2.6f \n',...
	iter,norm(grad),fun_val);
end

结果分析

对于降噪后结果的评估使用和方差(SSE),其计算公式为 S S E = ∥ x ∗ − x ∥ 2 SSE=\Vert x^*-x \Vert ^2 SSE=xx2.

最小二乘(RLS)

在这里插入图片描述

在这里插入图片描述

结果表明,当 λ \lambda λ 取值越大时,RLS的解变得越平滑。当 λ = 1 \lambda=1 λ=1 时,RLS的解非常接近于有噪声的信号 b b b,不够平滑。当 λ = 100 \lambda=100 λ=100 时,我们得到了一条更加平滑的RLS信号,但是,相较于 λ = 10 \lambda=10 λ=10 的RLS结果来说,精确度更低,特别是在靠近边界的地方。RLS的解在 λ = 1000 \lambda=1000 λ=1000 时变得非常平滑,但是也更加偏离真实信号。

定步长梯度下降(GMC)

x 0 = ( 0 , 0 , …   ) , t ˉ = 0.005 , ϵ = 5 x_0=(0,0,\dots),\bar{t}=0.005,\epsilon=5 x0=(0,0,),tˉ=0.005,ϵ=5

λ \lambda λEpochs
0.5370
5370
50368

在这里插入图片描述

在这里插入图片描述

定步长梯度下降的精度整体偏低,其解严重偏离真实信号,特别是在波峰处。在实验时,发现定步长 t ˉ \bar{t} tˉ 的选取不能过大,否则目标函数发散,函数值持续增长到正无穷,梯度下降偏离下降中心,相反,若 t ˉ \bar{t} tˉ 选取过小,将导致收敛速度极慢。 ϵ \epsilon ϵ 选取过小,导致目标函数不收敛, ϵ \epsilon ϵ 选取过大,将造成上述结果不精确到情况。

回溯法梯度下降(GMB)

x 0 = ( 0 , 0 , …   ) , s = 0.1 , α = 0.5 , β = 0.3 , ϵ = 0.7 x_0=(0,0,\dots),s=0.1, \alpha=0.5, \beta=0.3,\epsilon=0.7 x0=(0,0,),s=0.1,α=0.5,β=0.3,ϵ=0.7

λ \lambda λEpochs
0.137
541
50335

在这里插入图片描述

在这里插入图片描述

回溯法的梯度下降精确度较高。在 λ \lambda λ 较小时,需要的迭代步数较少,随着 λ \lambda λ 增大,迭代步数随之增加,但GMB曲线也更加平滑。

总结

本次试验对比了最小二乘、定步长梯度下降和回溯法的梯度下降法对添加高斯加性噪声的信号的降噪情况,通过添加正则项达到降噪的目的。最小二乘法的结果受惩罚系数 λ \lambda λ 的影响较大,但当 λ \lambda λ 选取合适时,将实现较好的降噪效果,得到比较光滑且接近原信号的RLS解;定步长梯度下降的降噪结果严重偏离真实信号,且对 t ˉ \bar{t} tˉ ϵ \epsilon ϵ 的选取要求较高,目标函数易发散。回溯法的梯度下降所得降噪的结果不仅精度高,而且可通过增大 λ \lambda λ ,提高降噪效果,且不会使降噪后的信号严重偏离原信号。

原创文章!转载需注明来源:©️ Sylvan Ding’s Blog ❤️

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于Logistic回归的L1正则化,损失函数为: J(w) = -1/m * [sum(yi*log(h(xi)) + (1-yi)*log(1-h(xi))) + lambda * sum(abs(w))] 其中,yi是第i个样本的标签,h(xi)是该样本的预测概率,w是模型参数,lambda是正则化系数。可以使用梯度下降算法更新参数: w_j = w_j - alpha * (1/m * sum((h(xi)-yi)*xi_j) + lambda * sign(w_j)) 其中,alpha是学习率,sign(w_j)是w_j的符号函数,即当w_j>0时为1,w_j<0时为-1,w_j=0时为0。 对于Logistic回归的L2正则化,损失函数为: J(w) = -1/m * [sum(yi*log(h(xi)) + (1-yi)*log(1-h(xi))) + lambda/2 * sum(w^2)] 其中,yi是第i个样本的标签,h(xi)是该样本的预测概率,w是模型参数,lambda是正则化系数。可以使用梯度下降算法更新参数: w_j = w_j - alpha * (1/m * sum((h(xi)-yi)*xi_j) + lambda * w_j) 其中,alpha是学习率。注意,L2正则化中的正则化项是w的平方和,而不是绝对值和。 下面是使用Python实现Logistic回归的L1正则化和L2正则化的代码: ```python import numpy as np class LogisticRegression: def __init__(self, lr=0.1, num_iter=1000, fit_intercept=True, regularization=None, lambda_=0.1): self.lr = lr self.num_iter = num_iter self.fit_intercept = fit_intercept self.regularization = regularization self.lambda_ = lambda_ def __add_intercept(self, X): intercept = np.ones((X.shape[0], 1)) return np.concatenate((intercept, X), axis=1) def __sigmoid(self, z): return 1 / (1 + np.exp(-z)) def __loss(self, h, y): return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean() def __l1_regularization(self, w): return self.lambda_ * np.abs(w[1:]).sum() def __l2_regularization(self, w): return self.lambda_ * np.sum(w[1:] ** 2) def fit(self, X, y): if self.fit_intercept: X = self.__add_intercept(X) self.theta = np.zeros(X.shape[1]) for i in range(self.num_iter): z = np.dot(X, self.theta) h = self.__sigmoid(z) if self.regularization == 'l1': # L1正则化 grad = np.dot(X.T, (h - y)) / y.size + self.lambda_ * np.sign(self.theta) elif self.regularization == 'l2': # L2正则化 grad = np.dot(X.T, (h - y)) / y.size + self.lambda_ * self.theta else: grad = np.dot(X.T, (h - y)) / y.size self.theta -= self.lr * grad def predict_prob(self, X): if self.fit_intercept: X = self.__add_intercept(X) return self.__sigmoid(np.dot(X, self.theta)) def predict(self, X, threshold=0.5): return self.predict_prob(X) >= threshold ``` 其中,lr是学习率,num_iter是迭代次数,fit_intercept表示是否拟合截距,regularization表示正则化方法,lambda_是正则化系数。在fit方法中,通过判断regularization的取值,来实现L1正则化和L2正则化。在L1正则化中,使用np.sign函数计算符号函数,而在L2正则化中,直接对参数的平方和进行惩罚。在predict_prob方法中,对X进行截距拟合和sigmoid变换,返回预测概率。在predict方法中,对预测概率进行阈值处理,返回预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值