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
解向量。
- rnorm浮动
残差的2-范数,
|| Ax-b ||_2
。
参见
lsq_linear
带变量约束的线性最小二乘法
注释
该代码基于 [2] ,这是对经典算法 [1] 的改进版本。它利用了活动集方法,并解决了非负最小二乘问题的 KKT(Karush-Kuhn-Tucker)条件。
参考文献
[1]: Lawson C., Hanson R.J., “解决最小二乘问题”, SIAM, 1995, DOI:10.1137/1.9781611971217
[2]: Bro, Rasmus 和 de Jong, Sijmen, “一种快速的非负约束最小二乘算法”, 化学计量学期刊, 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)