scipy.optimize.

nnls#

scipy.optimize.nnls(A, b, maxiter=None, *, atol=None)[源代码]#

求解 argmin_x || Ax - b ||_2,其中 x>=0

这个问题,通常被称为非负最小二乘问题,是一个带有凸约束的凸优化问题。当 x 建模的量只能取非负值时,通常会出现这种情况;例如,成分的重量、组件的成本等等。

参数:
A(m, n) ndarray

系数数组

b(m,) ndarray, float

右侧向量。

maxiter: int, 可选

最大迭代次数,可选。默认值为 3 * n

atol: float

算法中用于评估投影残差 (A.T @ (A x - b) 条目接近零的容差值。增加此值会放宽解的约束。一个典型的松弛值可以选择为 max(m, n) * np.linalg.norm(a, 1) * np.spacing(1.)。此值未设置为默认值,因为对于大型问题,范数运算会变得非常耗时,因此只能在必要时使用。

返回:
xndarray

解向量。

rnormfloat

残差的 2-范数,|| Ax-b ||_2

另请参阅

lsq_linear

变量有界限的线性最小二乘

备注

该代码基于 [2],它是 [1] 的经典算法的改进版本。它采用了一种活动集方法,并解决了非负最小二乘问题的 KKT(卡罗需-库恩-塔克)条件。

参考文献

[1]

: Lawson C., Hanson R.J., “Solving Least Squares Problems”, SIAM, 1995, DOI:10.1137/1.9781611971217

[2]

: Bro, Rasmus 和 de Jong, Sijmen, “A Fast Non-Negativity- Constrained Least Squares Algorithm”, Journal Of Chemometrics, 1997, DOI:10.1002/(SICI)1099-128X(199709/10)11:5<393::AID-CEM483>3.0.CO;2-L

示例

>>> import numpy as np
>>> from scipy.optimize import nnls
...
>>> A = np.array([[1, 0], [1, 0], [0, 1]])
>>> b = np.array([2, 1, 1])
>>> nnls(A, b)
(array([1.5, 1. ]), 0.7071067811865475)
>>> b = np.array([-1, -1, -1])
>>> nnls(A, b)
(array([0., 0.]), 1.7320508075688772)