scipy.optimize.
nnls#
- scipy.optimize.nnls(A, b, *, maxiter=None, atol=<object object>)[源码]#
求解
argmin_x || Ax - b ||_2
且x>=0
。此问题常被称为非负最小二乘法(NonNegative Least Squares),是一个具有凸约束的凸优化问题。它通常出现在
x
模型量只能取非负值的情况下;例如成分的重量、组件成本等。自 1.18.0 版本起废弃:通过位置传递参数
{'maxiter'}
已废弃;从 SciPy 1.18.0 开始,这些参数将仅支持关键字传递。参数{'atol'}
已废弃,无论是通过位置还是关键字传递;它们将在 SciPy 1.18.0 中移除。- 参数:
- A(m, n) ndarray
系数数组
- b(m,) ndarray, float
右侧向量。
- maxiter: int, 可选
最大迭代次数,可选。默认值为
3 * n
。- atolfloat, 可选
自 1.18.0 版本起废弃:此参数已废弃,并将在 SciPy 1.18.0 中移除。它在实现中未使用。
- 返回:
- xndarray
解向量。
- rnormfloat
残差的 2-范数,
|| Ax-b ||_2
。
另请参阅
lsq_linear
带变量边界的线性最小二乘
注释
此代码基于 [1] 的经典算法。它利用活跃集方法并求解非负最小二乘问题的 KKK (Karush-Kuhn-Tucker) 条件。
参考文献
[1]: Lawson C., Hanson R.J., “Solving Least Squares Problems”, SIAM, 1995, DOI:10.1137/1.9781611971217
示例
>>> 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)