软阈值(Soft Thresholding)函数

1. 软阈值(Soft Thresholding)函数的作用

  软阈值(Soft Thresholding)可以求解如下优化问题:
       arg min ⁡ x ∥ X − B ∥ 2 2 + λ ∥ x ∥ 1 \argmin_x \| X - B\|_2^2 + \lambda\| x\|_1 xargminXB22+λx1
  其中:
       X = [ x 1 , x 2 , … , x N ] T X = [x_1, x_2, \dots, x_N]^T X=[x1,x2,,xN]T
       B = [ b 1 , b 2 , … , b N ] T B = [b_1, b_2, \dots, b_N]^T B=[b1,b2,,bN]T

  根据范数的定义,可以将上面优化问题的目标函数拆开:

   F ( X ) = ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 = [ ( x 1 − b 1 ) 2 + λ ∥ x 1 ∥ ] + [ ( x 2 − b 2 ) 2 + λ ∥ x 2 ∥ ] + ⋯ + [ ( x N − b N ) 2 + λ ∥ x N ∥ ] F(X) = \|X-B \|_2^2 + \lambda\| X\|_1 \\= [(x_1-b_1)^2+\lambda \| x_1\|] + [(x_2-b_2)^2+\lambda \| x_2\|] + \dots + [(x_N-b_N)^2+\lambda \| x_N\|] F(X)=XB22+λX1=[(x1b1)2+λx1]+[(x2b2)2+λx2]++[(xNbN)2+λxN]

  也就是说,我们可以通过求解 N N N 个独立的形如函数

       f ( x ) = ( x − b ) 2 + λ ∣ x ∣ f(x) = (x-b)^2 + \lambda |x | f(x)=(xb)2+λx

的优化问题,来求解这个问题。由中学时代学过的求极值方法知道,可以求函数 f ( x ) f(x) f(x) 导数:

       d f ( x ) d x = 2 ( x − b ) + λ sgn ( x ) \frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x) dxdf(x)=2(xb)+λsgn(x)
       sgn ( x ) = 1 , x > 0 \textrm{sgn}(x) = 1, x > 0 sgn(x)=1,x>0
       sgn ( x ) = − 1 , x < 0 \textrm{sgn}(x) = -1, x < 0 sgn(x)=1,x<0

  这里解释一下变量 x x x 绝对值的导数,当 x > 0 x > 0 x>0 时, ∣ x ∣ = x | x|=x x=x,因此其导数等于 1;当 x < 0 x < 0 x<0 时, ∣ x ∣ = x | x|=x x=x,因此其导数等于 -1;综合起来, x x x 绝对值的导数等于 sgn ( x ) \textrm{sgn}(x) sgn(x)。令函数 f ( x ) f(x) f(x) 导数等于 0,得:
       x = b − λ 2 sgn ( x ) x = b - \frac{\lambda}{2} \textrm{sgn}(x) x=b2λsgn(x)

  这个结果等号两端都有变量 x x x,需要再化简一下。下面分三种情况讨论:

  1. b > λ / 2 b > \lambda / 2 b>λ/2

假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=1,所以 x = b + λ / 2 > 0 x = b + \lambda/2 > 0 x=b+λ/2>0,与假设 x < 0 x < 0 x<0 矛盾;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 > 0 x = b - \lambda/2 > 0 x=bλ/2>0,成立;

  所以此时在 x = b − λ / 2 > 0 x = b - \lambda/2 > 0 x=bλ/2>0 处取得极小值:

f ( x ) ∣ x = b − λ / 2 = ( b − λ 2 − b ) 2 + λ ( b − λ 2 ) = b λ − λ 2 4 = − ( λ 2 ) 2 + 2 b λ 2 = − ( λ 2 ) 2 + 2 b λ 2 − b 2 + b 2 = − ( λ 2 − b ) 2 + b 2 < b 2 = f ( 0 ) f(x)|_{x = b - \lambda/2} = (b - \frac{\lambda}{2}-b)^2 + \lambda(b - \frac{\lambda}{2}) \\= b\lambda - \frac{\lambda^2}{4} \\= -(\frac{\lambda}{2})^2 + 2b\frac{\lambda}{2} \\= -(\frac{\lambda}{2})^2 + 2b\frac{\lambda}{2} - b^2 + b^2 \\= -(\frac{\lambda}{2} - b)^2 + b^2 < b^2 = f(0) f(x)x=bλ/2=(b2λb)2+λ(b2λ)=bλ4λ2=(2λ)2+2b2λ=(2λ)2+2b2λb2+b2=(2λb)2+b2<b2=f(0)

  即此时极小值小于 f ( 0 ) f(0) f(0),而当 x < 0 x <0 x<0

d f ( x ) d x = 2 ( x − b ) + λ sgn ( x ) = 2 x − 2 b − λ < 2 x − 2 ( λ 2 ) − λ = 2 x − 2 λ < 0 \frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x) \\ = 2x-2b-\lambda \\ < 2x-2(\frac{\lambda}{2}) - \lambda \\ =2x-2\lambda < 0 dxdf(x)=2(xb)+λsgn(x)=2x2bλ<2x2(2λ)λ=2x2λ<0

  即当 x < 0 x <0 x<0 时函数 f ( x ) f(x) f(x) 为单调降函数 (对任意 Δ x < 0 , f ( 0 ) < f ( Δ x ) \Delta x < 0, f(0) < f(\Delta x) Δx<0,f(0)<f(Δx))。因此,函数在 x = b − λ 2 > 0 x = b - \frac{\lambda}{2} > 0 x=b2λ>0 处取得最小值。


  1. b < λ / 2 b < \lambda / 2 b<λ/2

假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=1,所以 x = b + λ / 2 < 0 x = b + \lambda/2 < 0 x=b+λ/2<0,成立;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 < 0 x = b - \lambda/2 < 0 x=bλ/2<0,与假设 x < 0 x < 0 x<0 矛盾;

  所以此时在 x = b + λ / 2 < 0 x = b + \lambda/2 < 0 x=b+λ/2<0 处取得极小值:

f ( x ) ∣ x = b + λ / 2 = ( b + λ 2 − b ) 2 + λ ( b + λ 2 ) = − b λ − λ 2 4 = − ( λ 2 ) 2 − 2 b λ 2 = − ( λ 2 ) 2 − 2 b λ 2 − b 2 + b 2 = − ( λ 2 + b ) 2 + b 2 < b 2 = f ( 0 ) f(x)|_{x = b + \lambda/2} = (b + \frac{\lambda}{2}-b)^2 + \lambda(b + \frac{\lambda}{2}) \\= -b\lambda - \frac{\lambda^2}{4} \\= -(\frac{\lambda}{2})^2 - 2b\frac{\lambda}{2} \\= -(\frac{\lambda}{2})^2 - 2b\frac{\lambda}{2} - b^2 + b^2 \\= -(\frac{\lambda}{2} + b)^2 + b^2 < b^2 = f(0) f(x)x=b+λ/2=(b+2λb)2+λ(b+2λ)=bλ4λ2=(2λ)22b2λ=(2λ)22b2λb2+b2=(2λ+b)2+b2<b2=f(0)

  即此时极小值小于 f ( 0 ) f(0) f(0),而当 x > 0 x >0 x>0

d f ( x ) d x = 2 ( x − b ) + λ sgn ( x ) = 2 x − 2 b + λ > 2 x − 2 ( − λ 2 ) + λ = 2 x + 2 λ > 0 \frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x) \\ = 2x-2b+\lambda \\ > 2x-2(-\frac{\lambda}{2}) + \lambda \\ =2x+2\lambda > 0 dxdf(x)=2(xb)+λsgn(x)=2x2b+λ>2x2(2λ)+λ=2x+2λ>0

  即当 x < 0 x <0 x<0 时函数 f ( x ) f(x) f(x) 为单调降函数 (对任意 Δ x < 0 , f ( 0 ) < f ( Δ x ) \Delta x < 0, f(0) < f(\Delta x) Δx<0,f(0)<f(Δx))。因此,函数在 x = b − λ 2 > 0 x = b - \frac{\lambda}{2} > 0 x=b2λ>0 处取得最小值。


  1. − λ 2 < b < λ 2 -\frac{\lambda}{2} < b <\frac{\lambda}{2} 2λ<b<2λ

假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=1,所以 x = b + λ / 2 > 0 x = b + \lambda/2 > 0 x=b+λ/2>0,与假设 x < 0 x < 0 x<0 矛盾;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 < 0 x = b - \lambda/2 < 0 x=bλ/2<0,与假设 x > 0 x > 0 x>0 矛盾;

  即无论 x x x 为大于 0 还是小于 0 均没有极值点,那么 x = 0 x = 0 x=0 是否为函数 f ( x ) f(x) f(x) 的极值点呢?

对于 Δ x ≠ 0 \Delta x \neq 0 Δx=0

f ( Δ x ) = ( Δ x − b ) 2 + λ ∣ Δ x ∣ = ( Δ x ) 2 − 2 Δ x b + b 2 + λ ∣ Δ x ∣ = ( Δ x ) 2 − 2 Δ x b + λ ∣ Δ x ∣ + f ( 0 ) f(\Delta x) = (\Delta x - b)^2 + \lambda | \Delta x| \\ = (\Delta x)^2 - 2 \Delta xb + b^2 + \lambda |\Delta x| \\ = (\Delta x)^2 - 2 \Delta xb + \lambda |\Delta x| + f(0) f(Δx)=(Δxb)2+λΔx=(Δx)22Δxb+b2+λΔx=(Δx)22Δxb+λΔx+f(0)

Δ x > 0 \Delta x \gt 0 Δx>0 时,利用条件 b < λ 2 b < \frac{\lambda}{2} b<2λ 可得

f ( Δ x ) = ( Δ x ) 2 + 2 Δ x b + λ Δ x + f ( 0 ) > ( Δ x ) 2 − 2 Δ x λ 2 + λ Δ x + f ( 0 ) = ( Δ x ) 2 + f ( 0 ) > f ( 0 ) f(\Delta x) = (\Delta x)^2 + 2 \Delta xb + \lambda \Delta x + f(0)\\ > (\Delta x)^2 - 2 \Delta x \frac{\lambda}{2} + \lambda \Delta x + f(0)\\ = (\Delta x)^2 + f(0) > f(0) f(Δx)=(Δx)2+2Δxb+λΔx+f(0)>(Δx)22Δx2λ+λΔx+f(0)=(Δx)2+f(0)>f(0)

Δ x < 0 \Delta x \lt 0 Δx<0 时,利用条件 b < λ 2 b < \frac{\lambda}{2} b<2λ 可得

f ( Δ x ) = ( Δ x ) 2 − 2 Δ x b + λ ∣ Δ x ∣ + f ( 0 ) > ( Δ x ) 2 − 2 Δ x λ 2 + λ ∣ Δ x ∣ + f ( 0 ) = ( Δ x ) 2 + λ ( − Δ x ) + λ ∣ Δ x ∣ + f ( 0 ) = ( Δ x ) 2 + 2 λ ∣ Δ x ∣ + f ( 0 ) > f ( 0 ) f(\Delta x) = (\Delta x)^2 - 2 \Delta xb + \lambda |\Delta x| + f(0)\\ > (\Delta x)^2 - 2 \Delta x \frac{\lambda}{2} + \lambda |\Delta x| + f(0)\\ = (\Delta x)^2 + \lambda (-\Delta x) + \lambda |\Delta x| +f(0) \\ = (\Delta x)^2 + 2\lambda |\Delta x| +f(0) > f(0) f(Δx)=(Δx)22Δxb+λΔx+f(0)>(Δx)22Δx2λ+λΔx+f(0)=(Δx)2+λ(Δx)+λΔx+f(0)=(Δx)2+2λΔx+f(0)>f(0)

  因此,函数在 x = 0 x=0 x=0 处取得最小值。
  综合以上三种情况, f ( x ) f(x) f(x) 的最小值在以下位置取得:

argmin f ( x ) = { b + λ 2 , b < − λ 2 0 , ∣ b ∣ < λ 2 b − λ 2 , b > λ 2 \textrm{argmin} f(x) = \begin{cases} b+\frac{\lambda}{2} & ,b < -\frac{\lambda}{2} \\ 0 &, |b| < \frac{\lambda}{2} \\ b-\frac{\lambda}{2} &, b > \frac{\lambda}{2} \end{cases} argminf(x)=b+2λ0b2λ,b<2λ,b<2λ,b>2λ

  与前面的软阈值(Soft Thresholding)对比一下,发现了么?若将上式中的 b b b 视为变量, λ 2 \frac{\lambda}{2} 2λ 视为阈值,上式即为软阈值 (SoftThresholding) 的公式。

  至此,我们可以得到优化问题

       arg min ⁡ x ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \| X -B\|^2_2 + \lambda \| X\|_1 xargminXB22+λX1
的解为

soft ( B , λ 2 ) = { B + λ 2 , B < − λ 2 0 , ∣ B ∣ < λ 2 B − λ 2 , B > λ 2 \textrm{soft}(B, \frac{\lambda}{2}) = \begin{cases} B+ \frac{\lambda}{2} & ,B < -\frac{\lambda}{2} \\ 0 &, |B| < \frac{\lambda}{2} \\ B-\frac{\lambda}{2} &, B > \frac{\lambda}{2} \end{cases} soft(B,2λ)=B+2λ0B2λ,B<2λ,B<2λ,B>2λ

注:该式为软阈值(Soft Thresholding)的矩阵形式。


2. 软阈值(Soft Thresholding) 的变形

  当优化问题变为

       arg min ⁡ x 1 2 ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \frac{1}{2}\| X-B\|_2^2 + \lambda \| X\|_1 xargmin21XB22+λX1

  因为对目标函数乘一个常系数不影响极值点的获得,所以可等价为优化问题

       arg min ⁡ x ∥ X − B ∥ 2 2 + 2 λ ∥ X ∥ 1 \argmin_x \| X-B\|_2^2 + 2\lambda \| X\|_1 xargminXB22+2λX1

  此时的解为 s o f t ( B , λ ) soft(B, \lambda) soft(B,λ)


3. 软阈值(Soft Thresholding)的MATLAB代码

  软阈值(Soft Thresholding)的函数代码可以写成专门针对问题

       arg min ⁡ x ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \|X-B \|_2^2 + \lambda \| X\|_1 xargminXB22+λX1

  软阈值(Soft Thresholding)是如此简单以至于可以用一句代码去实现它:

  在这里插入图片描述

  当然,也可写为另一种形式:

function [soft_thresh] = softthresholding(b, lambda)
	soft_thresh = sign(b).*max(abs(b) - lambda/2, 0);
end

python 代码:

# Soft Thresholding
def softthresholding(b, lam):
    soft_thresh = sign(b) * max(abs(b) - lam//2, 0)
    return soft_thresh

一定要注意:这种写法是针对最开始的优化问题:

arg min ⁡ x ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 + \lambda \| X\|_1 xargminXB22+λX1

只需调用 softthresholding( B , λ 2 B, \frac{\lambda}{2} B,2λ) 即可。

若要解决优化问题

arg min ⁡ x ∥ X − B ∥ 2 2 / 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 / 2+ \lambda \| X\|_1 xargminXB22/2+λX1

只需调用 softthresholding( B , λ B, \lambda B,λ) 即可。


4. 软阈值(Soft Thresholding)测试代码

  用以下一小段代码测试软阈值,用来求解优化问题:

       arg min ⁡ x ∥ X − B ∥ 2 2 / 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 / 2+ \lambda \| X\|_1 xargminXB22/2+λX1

  这里用的对比函数是基追踪降噪 (BPDN_quadprog.m),参见 压缩感知重构算法之基追踪降噪,使用 BPDN 时,实际上就是观测矩阵为单位阵时的一种特殊情况:

clear all;close all;clc; 
b = [-0.8487   -0.3349    0.5528    1.0391   -1.1176]';
lambda = 1;
x1=soft(b,lambda)
x2=BPDN_quadprog(b,eye(length(b)),lambda)
fprintf('\nError between soft and BPDN = %f\n',norm(x1-x2))

  这里就不给出输出结果了。运行后,观察输出结果可知,soft函数与BPDN_quadprog函数的输结果相同。

  另外,可以在matlab里输入以下命令看一个软阈值的图像:

x=-5:0.1:5;T=1;y=soft(x,T);plot(x,y);grid;

在这里插入图片描述

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阈值函数是小波阈值去噪中常用的一种阈值函数,用于对小波分解后的系数进行阈值处理。阈值函数的定义如下: $$soft(x, \lambda) = \begin{cases} x - \lambda, & \text{if } x > \lambda \\ 0, & \text{if } -\lambda \leq x \leq \lambda \\ x + \lambda, & \text{if } x < -\lambda \end{cases}$$ 其中,$x$为小波分解后的系数,$\lambda$为阈值阈值函数的作用是将小于阈值的系数置为0,将大于阈值的系数减去阈值,将小于负阈值的系数加上阈值,从而对噪声进行抑制。 阈值函数相对于硬阈值函数的优点是,它能够产生平滑的阈值曲线,从而更好地保留信号的主要特征。此外,阈值函数能够处理更多的信号类型,包括存在较强相关性的信号。 在Matlab中,可以使用wthresh函数来实现阈值函数,例如: ```matlab % 生成测试数据 x = 0:0.01:1; y = sin(2*pi*5*x) + randn(size(x)); % 进行小波分解 [c,l] = wavedec(y,5,'db4'); % 计算阈值 thr = wthrmngr('sqtwolog',c); % 进行阈值处理 s = wthresh(c,'s',thr); % 进行小波重构 y_denoised = waverec(s,l,'db4'); % 绘制原始信号和去噪后的信号 plot(x,y); hold on; plot(x,y_denoised,'r'); legend('Original Signal','Denoised Signal'); ``` 在上述示例中,我们首先生成了一个带有噪声的信号,然后使用小波分解对其进行处理,计算出阈值,使用阈值函数对分解系数进行处理,最后进行小波重构得到去噪后的信号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值