解决此问题的另一种方法是考虑离散逆问题的工具,即涉及解决或min |的问题。| A x − b | | 2其中甲非常病态(即,第一和最后一个奇异值之间的比率σ 1 / σ ÑAx=bmin||Ax−b||2Aσ1/σn大)。
在这里,我们有几种选择停止准则的方法,对于迭代方法,我建议使用L曲线准则,因为它仅涉及已经可用的量(免责声明:我的顾问率先采用了这种方法,因此我肯定偏向于它)。我已经在迭代方法中成功使用了它。
ρk=||Axk−b||2 and the solution norm ηk=||xk||2, where xk is the k'th iterate. As you iterate, this begins to draw the shape of an L in a loglog(rho,eta) plot, and the point at the corner of that L is the optimal choice.
This allows you to implement a criterion where you keep an eye on when you have passed the corner (i.e. looking at the gradient of (ρk,ηk)), and then choose the iterate that was located at the corner.
The way I did it involved storing the last 20 iterates, and if the gradient abs(log(ηk)−log(ηk−1)log(ρk)−log(ρk−1)) was larger than some threshold for 20 successive iterations, I knew that I was on the vertical part of the curve and that I had passed the corner. I then took the first iterate in my array (i.e. the one 20 iterations ago) as my solution.
There are also more detailed methods for finding the corner, and these work better but require storing a significant number of iterates. Play around with it a bit. If you are in matlab, you can use the toolbox Regularization Tools, which implements some of this (specifically the "corner" function is applicable).
Note that this approach is particularly suitable for large-scale problems, since the extra computing time involved is minuscule.