非负最小二乘法中的 Tikhonov 正则化 - NNLS (python:scipy)

计算科学 优化 凸优化 非线性规划 回归 scipy
2021-12-20 08:49:02

我正在做一个项目,我需要在 NNLS 算法中添加正则化。有没有办法将 Tikhonov 正则化添加到 scipy [1] 的 NNLS 实现中?

[2] 谈论它,但没有显示任何实现。Sklearn 有一个实现,但它不适用于 nnls。

[1] http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.nnls.html

[2] http://icses2012.pwr.wroc.pl/article/34.pdf

2个回答

如果你想要解决

minAxb22+λ2x22

受制于

x0 ,

那么这很容易实现。构造一个矩阵

C=[AλI]

和一个向量

d=[b0]

然后使用您的非负最小二乘求解器

minCxd22

受制于

x0

您可以轻松地将其扩展到表单的问题

minAxb22+λ2L(xx0)22

通过让

C=[AλL]

d=[bλLx0]

如果 fortran 代码https://github.com/scipy/scipy/blob/master/scipy/optimize/nnls/nnls.f没有 Tikhonov 正则化选项,则可能需要一些工作才能将此功能添加到scipy。

编辑:我看了.pdf。我猜你想找到最小的以便为正。我认为任何给定都有一个或多或少的封闭形式解决方案,并且 .pdf 提到对的二等分搜索,直到你找到最小的一个,这样最好的是正的。这看起来很简单,因为它不需要任何奇怪的分解或凌乱的 fortran 代码。λargminx||Axb||2+λ2||x||2argminxλλx

编辑 2:我注意到这个问题被标记为convex-optimization. 如果您想从字面上采用这种方法,那么您可以尝试 cvx ( http://cvxr.com/cvx/ ) 或 cvxpy ( https://github.com/cvxgrp/cvxpy )。