MATLAB中阈值内的最小二乘最小化



MATLAB的cvx套件可以解决下面的(看似无辜的)优化问题,但对于我正在处理的大型全矩阵来说,它相当慢。我希望这是因为使用cvx太过了,而且这个问题实际上有一个解析解,或者巧妙地使用一些内置的MATLAB函数可以更快地完成任务。

背景:众所周知,x1=Abx2=pinv(A)*b都能解决最小二乘问题:

minimize norm(A*x-b)

区别为CCD_ 3。事实上,x2是问题的最小范数解,因此norm(x2)<=norm(x)对于所有可能的解x

定义D=norm(A*x2-b)(相当于D=norm(A*x1-b)),则x2解决问题

minimize norm(x)
subject to
norm(A*x-b) == D

问题:我想找到的解决方案

minimize norm(x)
subject to
norm(A*x-b) <= D+threshold

换句话说,我不需要norm(A*x-b)尽可能小,只需要在一定的公差范围内。我想要在bD+threshold内得到A*x的最小范数解x

我还没能在网上或手工找到这个问题的解析解(比如在经典最小二乘问题中使用伪逆)。我一直在搜索诸如"具有非线性约束的最小二乘"one_answers"具有阈值的最小二乘"之类的东西。

任何见解都将不胜感激,但我想我真正的问题是:在MATLAB中,解决这个"阈值"最小二乘问题的最快方法是什么

有趣的问题。我不知道你确切问题的答案,但下面给出了一个可行的解决方案。

回顾

定义res(x) := norm(Ax - b)。正如您所说,x2使res(x)最小化。在超定的情况下(通常A具有比col更多的行),x2是唯一的最小值。在不确定的情况下,它会被无限多的其他人加入*。然而,在所有这些中,x2是使norm(x)最小化的唯一一个。

总之,x2最小化(1)res(x)和(2)norm(x),并且它按照优先级的顺序这样做。事实上,这是x2的特征(完全决定)。

极限特性

但是,x2的另一个特征是

x2 := limit_{e-->0} x_e

其中

x_e := argmin_{x} J(x;e)

其中

J(x;e) := res(x) + e * norm(x)

可以看出

x_e = (A A' + e I)^{-1} A' b      (eqn a)

应该意识到x2的这种特性是相当神奇的。即使(A A')^{-1}不存在,也存在限制。并且该限制在某种程度上保留了优先级(2)。

使用e>0

当然,对于有限(但很小)的enorm(x2)<=norm(x1)0不会最小化res(x)(相反,它会最小化J(x;e))。用你的术语来说,区别在于门槛。我将把它重命名为

gap := res(x_e) - min_{x} res(x).

减小CCD_ 33的值保证了减小gap的值。因此,通过调整e很容易达到特定的gap值(即阈值)。**

这种类型的修改(将norm(x)添加到res(x)最小化问题中)被称为统计学中的正则化,通常被认为是稳定性(数值和参数值)的好主意。


*:注意,x1x2仅在欠定情况中不同

**:它甚至不需要任何繁重的计算,因为如果已经计算了A的SVD,那么对于e的任何(正)值,(eqn a)中的倒数都很容易计算。

相关内容

  • 没有找到相关文章

最新更新