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, optional

最大迭代次數,可選。預設值為 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(Karush-Kuhn-Tucker)條件。

參考文獻

[1]

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

[2]

: Bro, Rasmus and 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)