MATLAB中阈值内的最小二乘法

Posted

技术标签:

【中文标题】MATLAB中阈值内的最小二乘法【英文标题】:Least-squares minimization within threshold in MATLAB 【发布时间】:2016-03-25 12:41:20 【问题描述】:

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

背景:众所周知,x1=A\bx2=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+thresholdb 中得到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

当然,对于有限(但很小)ex_e 不会最小化res(x)(而是最小化J(x;e))。用您的术语来说,区别在于阈值。我将其重命名为

gap := res(x_e) - min_x res(x).

减少e 的值可以保证减少gap 的值。因此,通过调整e 很容易达到特定的gap 值(即阈值)。**

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


*:请注意x1x2 仅在未确定的情况下有所不同

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

【讨论】:

以上是关于MATLAB中阈值内的最小二乘法的主要内容,如果未能解决你的问题,请参考以下文章

基于LS最小二乘法的无线定位matlab仿真

MATLAB | 最小二乘法的两种解读

MATLAB | 最小二乘法的两种解读

最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

Python最小二乘法拟合与作图

预测模型基于最小二乘法预测数据matlab源码