MATLAB的cvx套件可以解决下面的(看似无辜的)优化问题,但对于我正在处理的大型全矩阵来说,它相当慢。我希望这是因为使用cvx太过了,而且这个问题实际上有一个解析解,或者巧妙地使用一些内置的MATLAB函数可以更快地完成任务。
背景:众所周知,x1=Ab
和x2=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)
尽可能小,只需要在一定的公差范围内。我想要在b
的D+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
当然,对于有限(但很小)的e
,norm(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)
最小化问题中)被称为统计学中的正则化,通常被认为是稳定性(数值和参数值)的好主意。
*:注意,x1
和x2
仅在欠定情况中不同
**:它甚至不需要任何繁重的计算,因为如果已经计算了A的SVD,那么对于e
的任何(正)值,(eqn a)
中的倒数都很容易计算。