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)