接上篇更新的L2范数求解的问题,接着讲L1范数更新的问题
L1范数正则化项又称为拉布拉斯先验。带有L1正则化项的问题是图问题,求解相对简单,具有闭式解。其求解就是著名的软阈值公式。
问题
x =argxmin2ρ∥x−b∥22+λ∥x∥1
其中,
x ,
b均为向量。
推倒与求解
原问题是对向量进行求解,难以解决。但是如果
x ,
b都是标量,那么问题就简单了。
1. 问题分解
问题分解
在图像处理中,我们通常将向量
x ,
b的元素都看成独立的,则原问题的求解可以转换为对单个元素的求解,抽取原问题中的一个元素进行求解,则问题转换为
x=argxmin2ρ(x−b)2+λ∣x∣
其中,
x,
b(没有加粗),表示标量,为向量
x ,
b中的第i个元素,省略下表i。
2. 分解问题求解
分解的问题就是一个一元二次问题求解最小值,由于图像处理中,存在某些先验知识,一般
ρ,λ都为非负数。将上述问题重写为
x=argxmin2ρ(x−b)2+λ∣x∣,s.t.ρ≥0,λ≥0
求解这个问题初中知识就够了。下面简单的给出结论
当
x≥0:
x={b−ρλ0b−ρλ>0b−ρλ≤0
当
x≤0:
x={0b+ρλb+ρλ>0b+ρλ≤0
求解还是简单的,但是使用分段函数的形式写出来太不美观,如何写成一个式子,当初还是难到了我,读者可以自己想想,我是没有想出来,师兄教的
x=sign(b)max(∣b∣−ρλ,0)
这样写的目的当然不只是为了好看,更是为了编写代码。MATLAB不几行就搞定了。
3. 原问题求解
分解的每隔问题求解了,其实原问题就解出来了,但是我们通常看到的求解这种问题,可不是一个一个子问题这样写出来,下面给出常见的求解形式。
x=shrinkρλ(b)
注意这里的元素依然是标量。
shrink称为软阈值算子。其含义为
Sk(a)=⎩⎨⎧a−ka>k0a≤ka+k a<−k
软阈值公式,我们也叫作软阈值收缩公式,只是因为他求解的过程可以看出收缩的过程。就以上式为例,当a较大的时候,就在
a的基础上减去
k。 反之,如果
a是负值,
a越小,就在
a的基础上加上
k,一直在像0值附近收缩。简单的公式还是特别有意思的,这种求解的思路也是特别受用,在很多其他类似的问题上,例如硬阈值、TV正则化项等都可以使用这种思路求解。
MATLAB实现
matlab实现的代码特别简单。
% define the soft threshold function, which is used above.
function y = soft(x,tau)
y = sign(x).*max(abs(x)-tau,0);