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)
尽可能小,只要在一定的容忍度内。x
我想要得到A*x
的最小范数解决D+threshold
方案b
。
我无法在网络上或手动找到该问题的解析解决方案(例如在经典最小二乘问题中使用伪逆)。我一直在搜索诸如“具有非线性约束的最小二乘”和“具有阈值的最小二乘”之类的东西。
任何见解将不胜感激,但我想我真正的问题是: 在 MATLAB 中解决这个“阈值”最小二乘问题的最快方法是什么?