软阈值(SoftThresholding)函数解读
软阈值(Soft Thresholding)函数解读
函数的符号
软阈值(Soft Thresholding)⽬前⾮常常见,⽂献【1】【2】最早提出了这个概念。软阈值公式的表达⽅式归纳起来常见的有三种,以下是各⽂献中的软阈值定义符号:
⽂献【1】式(12):
⽂献【2】:
⽂献【3】:
⽂献【4】式(8):
⽂献【5】式(1.5):
⽂献【6】式(12)注释:
⽂献【7】:
其中⽂献【1】【2】【3】【5】是第⼀种,也是最常见的⼀种;⽂献【4】【6】是第⼆种,个⼈认为
可读性⽐第⼀种要好;⽂献【7】是第三种,个⼈认为可读性最好。当然,它们表达的意思是⼀样的(⽆论是sgn(x)还是sign(x)都是符号函数,即当x>0时为1,当
x<0时为-1):
以⽂献【1】符号为例解释第⼀种表⽰⽅式。这⾥w是变量,λ是阈值(⾮负值),符号(|w|-λ)+表⽰当(|w|-λ)>0时则等于|w|-λ,当(|w|-λ)<0时则等于0。那么分三种情况来讨论:第⼀种情况是w>λ>0,则sgn(w)=1,|w|=w,(|w|-λ)⼀定⼤于0,(|w|-λ)+=|w|-λ,所以ηS(w,λ)=w-λ;第⼆种情况是w<-λ<0,则sgn(w)=-1,|w|=-w,(|w|-λ)也⼀定⼤于0,(|w|-λ)+=|w|-λ,所以ηS(w,λ)=-1*(-w-λ)= w+λ;第三种情况是|w|<λ,此时(|w|-λ)⼀定⼩于0,则(|w|-λ)+=0,所以ηS(w,λ)=0。因此
以⽂献【6】符号为例解释第⼆种表⽰⽅式。这种表⽰⽅式中符号max{|u|-a,0}的作⽤与第⼀种表⽰⽅式中的符号(|w|-λ)+的作⽤⼀样,即当(|u|-a)>0时max{|u|-a,0}=(|u|-a),当(|u|-a)<0时max{|u|-a,0}=0,知道了这⼀点剩下的分析与第⼀种表⽰⽅式相同。
综上,三种表⽰⽅式均是⼀致的。
2、软阈值(Soft Thresholding)函数的作⽤
弄清楚了软阈值(Soft Thresholding)的符号表⽰以后,接下来说⼀说它的作⽤。以下内容主要参考了⽂献【7】,这是⼀个⾮常棒的PPT
软阈值(SoftThresholding)可以求解如下优化问题:
其中:
根据范数的定义,可以将上⾯优化问题的⽬标函数拆开:
也就是说,我们可以通过求解N个独⽴的形如函数
的优化问题,来求解这个问题。由中学时代学过的求极值⽅法知道,可以求函数f(x)导数:
这⾥要解释⼀下变量x绝对值的导数,当x>0时,|x|=x,因此其导数等于1;当x<0时,|x|=-x,因此其导数等于-1;综合起来,x绝对值的导数等于sgn(x)。令函数f(x)导数等于0,得:
这个结果等号两端都有变量x,需要再化简⼀下。下⾯分三种情况讨论:
(1)当b>λ/2时
假设x<0,则sgn(x)=-1,所以x=b+λ/2>0,与假设x<0⽭盾;
假设x>0,则sgn(x)=1,所以x=b-λ/2>0,成⽴;
所以此时在x=b-λ/2>0处取得极⼩值:
即此时极⼩值⼩于f(0),⽽当x<0时
即当x<0时函数f(x)为单调降函数(对任意△x<0,f(0)<f(△x))。因此,函数在x=b-λ/2>0处取得最⼩值。
(2)当b<-λ/2时
假设x<0,则sgn(x)=-1,所以x=b+λ/2<0,成⽴;
假设x>0,则sgn(x)=1,所以x=b-λ/2<0,与假设x<0⽭盾;
所以此时在x=b+λ/2<0处取得极⼩值:
即此时极⼩值⼩于f(0),⽽当x>0时
即当x>0时函数f(x)为单调升函数(对任意△x>0,f(△x)>f(0))。因此,函数在x=b+λ/2<0处取得最⼩值。
(3)当-λ/2<b<λ/2时(即|b|<λ/2时)
假设x<0,则sgn(x)=-1,所以x=b+λ/2>0,与假设x<0⽭盾;
假设x>0,则sgn(x)=1,所以x=b-λ/2<0,与假设x<0⽭盾;
即⽆论x为⼤于0还是⼩于0均没有极值点,那么x=0是否为函数f(x)的极值点呢?
对于△x≠0,
当△x >0时,利⽤条件b<λ/2可得
当△x <0时,利⽤条件b<λ/2可得(注:此时|△x |=-△x)
因此,函数在x=0处取得极⼩值,也是最⼩值。
综合以上三种情况,f(x)的最⼩值在以下位置取得:
与前⾯的软阈值(Soft Thresholding)对⽐⼀下,发现了么?若将上式中的b视为变量,λ/2视为阈值,上式即为软阈值(SoftThresholding)的公式。
⾄此,我们可以得到优化问题
的解为
注:该式为软阈值(Soft Thresholding)的矩阵形式。
3、软阈值(Soft Thresholding)的变形
当优化问题变为
因为对⽬标函数乘⼀个常系数不影响极值点的获得,所以可等价为优化问题
此时的解为soft (B , λ)。
4、软阈值(Soft Thresholding)的MATLAB 代码
软阈值(Soft Thresholding)的函数代码可以写成专门针对优化问题
软阈值(Soft Thresholding)是如此简单以⾄于可以⽤⼀句代码去实现它[8]:
                                              当然,如果不习惯这种形式,也可以写成常见的函数形式:1
2
fprintf作用
3
function  [ soft_thresh ] = softthresholding( b,lambda )      soft_thresh = sign  (b).* max  ( abs  (b) - lambda/2,0); end
⼀定要注意:这种写法是针对最开始的优化问题:
但我个⼈感觉更应该写成这种通⽤形式:1
2
3
function  [ x ] = soft( b,T )      x = sign  (b).* max  ( abs  (b) - T,0); end
如此之后,若要解决优化问题
只需调⽤soft(B, λ/2)即可;若要解决优化问题

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。