MATLAB中阈值内的最小二乘法
Posted
技术标签:
【中文标题】MATLAB中阈值内的最小二乘法【英文标题】:Least-squares minimization within threshold in MATLAB 【发布时间】:2016-03-25 12:41:20 【问题描述】:MATLAB 的cvx 套件可以解决下面的(看似无辜的)优化问题,但对于我正在使用的大型完整矩阵来说它相当慢。我希望这是因为使用 cvx 太过分了,而且问题实际上有一个解析解决方案,或者巧妙地使用一些内置的 MATLAB 函数可以更快地完成这项工作。
背景:众所周知,x1=A\b
和 x2=pinv(A)*b
都解决了最小二乘问题:
minimize norm(A*x-b)
区别在于norm(x2)<=norm(x1)
。事实上,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)
尽可能小,只要在一定的容差范围内即可。我想要在D+threshold
的b
中得到A*x
的最小范数解决方案x
。
我无法通过网络或手动找到该问题的解析解(例如在经典最小二乘问题中使用伪逆)。我一直在搜索诸如“具有非线性约束的最小二乘”和“具有阈值的最小二乘”之类的内容。
任何见解都将不胜感激,但我想我真正的问题是: 在 MATLAB 中解决这个“阈值”最小二乘问题的最快方法是什么?
【问题讨论】:
这看起来像QCQP 这是因为 cvx 将 QCQP 求解为半定程序。相反,您需要通过引入潜在变量来使用二阶锥程序 (SOCP)。这些是你可以用谷歌搜索的流行语。 【参考方案1】:有趣的问题。我不知道您的确切问题的答案,但下面提供了一个可行的解决方案。
回顾
定义res(x) := norm(Ax - b)
。
正如您所说,x2
最小化了res(x)
。在过度确定的情况下(通常A
的行数多于 col 的行数),x2
是唯一的最小值。在不确定的情况下,它被无限多的其他人加入*。但是,在所有这些中,x2
是唯一一个将norm(x)
最小化的。
总而言之,x2
将 (1) res(x)
和 (2) norm(x)
最小化,并且按照优先级顺序执行此操作。事实上,这表征(完全确定)x2
。
极限表征
但是,x2
的another characterization 是
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
当然,对于有限(但很小)e
,x_e
不会最小化res(x)
(而是最小化J(x;e)
)。用您的术语来说,区别在于阈值。我将其重命名为
gap := res(x_e) - min_x res(x).
减少e
的值可以保证减少gap
的值。因此,通过调整e
很容易达到特定的gap
值(即阈值)。**
这种类型的修改(将norm(x)
添加到res(x)
最小化问题)在统计文献中被称为正则化,通常被认为是稳定性(数值和参数值方面)的好主意。
*:请注意x1
和x2
仅在未确定的情况下有所不同
**:它甚至不需要任何繁重的计算,因为如果已经计算了 A 的 SVD,那么对于 e
的任何(正)值,(eqn a)
的逆很容易计算。
【讨论】:
以上是关于MATLAB中阈值内的最小二乘法的主要内容,如果未能解决你的问题,请参考以下文章