lsq_linear#
- scipy.optimize.lsq_linear(A, b, bounds=(-inf, inf), method='trf', tol=1e-10, lsq_solver=None, lsmr_tol=None, max_iter=None, verbose=0, *, lsmr_maxiter=None)[原始碼]#
求解變數受限的線性最小平方問題。
給定一個 m 乘 n 的設計矩陣 A 和一個具有 m 個元素的目標向量 b,
lsq_linear
求解以下最佳化問題minimize 0.5 * ||A x - b||**2 subject to lb <= x <= ub
此最佳化問題是凸函數,因此找到的最小值(如果迭代已收斂)保證是全域最小值。
- 參數:
- Aarray_like,線性算子的稀疏矩陣,形狀為 (m, n)
設計矩陣。可以是
scipy.sparse.linalg.LinearOperator
。- barray_like,形狀為 (m,)
目標向量。
- boundsarray_like 的 2 元組或
Bounds
,可選 參數的下限和上限。預設為無界限。有兩種方法可以指定界限
Bounds
類別的實例。array_like 的 2 元組:元組的每個元素必須是長度等於參數數量的陣列,或是一個純量(在這種情況下,所有參數都採用相同的界限)。使用
np.inf
和適當的符號來停用所有或某些參數的界限。
- method‘trf’ 或 ‘bvls’,可選
執行最小化的方法。
‘trf’:信任域反射演算法,適用於線性最小平方問題。這是一種類似內點法的方法,所需的迭代次數與變數數量的相關性較弱。
‘bvls’:有界變數最小平方演算法。這是一種主動集方法,需要的迭代次數與變數數量相當。當 A 是稀疏矩陣或 LinearOperator 時,不能使用此方法。
預設值為 ‘trf’。
- tolfloat,可選
容忍度參數。如果成本函數的相對變化在上次迭代中小於 tol,則演算法終止。此外,還會考慮一階最佳化度量
method='trf'
如果梯度的一致範數(已縮放以考慮界限的存在)小於 tol,則終止。method='bvls'
如果 Karush-Kuhn-Tucker 條件在 tol 容忍度內得到滿足,則終止。
- lsq_solver{None, ‘exact’, ‘lsmr’},可選
在整個迭代過程中求解無界限最小平方問題的方法
‘exact’:使用密集 QR 或 SVD 分解方法。當 A 是稀疏矩陣或 LinearOperator 時,不能使用此方法。
‘lsmr’:使用
scipy.sparse.linalg.lsmr
迭代程序,該程序僅需要矩陣-向量乘積評估。不能與method='bvls'
一起使用。
如果為 None(預設值),則根據 A 的類型選擇求解器。
- lsmr_tolNone、float 或 ‘auto’,可選
scipy.sparse.linalg.lsmr
的容忍度參數 ‘atol’ 和 ‘btol’。如果為 None(預設值),則設定為1e-2 * tol
。如果為 ‘auto’,則容忍度將根據目前迭代的最佳化程度進行調整,這可以加快最佳化過程,但並非總是可靠。- max_iterNone 或 int,可選
終止前的最大迭代次數。如果為 None(預設值),則對於
method='trf'
設定為 100,對於method='bvls'
設定為變數數量(不包括 ‘bvls’ 初始化的迭代次數)。- verbose{0, 1, 2},可選
演算法的詳細程度
0:靜默工作(預設值)。
1:顯示終止報告。
2:在迭代期間顯示進度。
- lsmr_maxiterNone 或 int,可選
如果使用 lsmr 最小平方求解器(透過設定
lsq_solver='lsmr'
),則為 lsmr 最小平方求解器的最大迭代次數。如果為 None(預設值),則使用 lsmr 的預設值min(m, n)
,其中m
和n
分別是 A 的行數和列數。如果lsq_solver='exact'
,則無效。
- 返回:
- 具有以下定義欄位的 OptimizeResult
- xndarray,形狀為 (n,)
找到的解。
- costfloat
解處的成本函數值。
- funndarray,形狀為 (m,)
解處的殘差向量。
- optimalityfloat
一階最佳化度量。確切含義取決於 method,請參閱 tol 參數的描述。
- active_maskint 的 ndarray,形狀為 (n,)
每個組件顯示對應的約束是否處於活動狀態(也就是說,變數是否位於界限處)
0:約束未處於活動狀態。
-1:下限處於活動狀態。
1:上限處於活動狀態。
對於 trf 方法可能有些任意,因為它產生嚴格可行的迭代序列,並且 active_mask 在容忍度閾值內確定。
- unbounded_soltuple
最小平方求解器(使用 lsq_solver 選項設定)傳回的無界限最小平方解元組。如果未設定 lsq_solver 或將其設定為
'exact'
,則元組包含形狀為 (n,) 的 ndarray(包含無界限解)、包含平方殘差總和的 ndarray、包含 A 秩的 int,以及包含 A 奇異值的 ndarray(請參閱 NumPy 的linalg.lstsq
以取得更多資訊)。如果將 lsq_solver 設定為'lsmr'
,則元組包含形狀為 (n,) 的 ndarray(包含無界限解)、包含退出碼的 int、包含迭代次數的 int,以及五個浮點數(包含各種範數和 A 的條件數)(請參閱 SciPy 的sparse.linalg.lsmr
以取得更多資訊)。此輸出對於確定最小平方求解器的收斂性很有用,尤其是迭代'lsmr'
求解器。無界限最小平方問題是最小化0.5 * ||A x - b||**2
。- nitint
迭代次數。如果無約束解是最佳解,則為零。
- statusint
演算法終止的原因
-1:演算法在上次迭代中無法取得進展。
0:已超過最大迭代次數。
1:一階最佳化度量小於 tol。
2:成本函數的相對變化小於 tol。
3:無約束解是最佳解。
- messagestr
終止原因的文字描述。
- successbool
如果滿足其中一個收斂準則,則為 True (status > 0)。
另請參閱
nnls
具有非負性約束的線性最小平方。
least_squares
變數受限的非線性最小平方。
註解
該演算法首先透過
numpy.linalg.lstsq
或scipy.sparse.linalg.lsmr
(取決於 lsq_solver)計算無約束最小平方解。如果此解在界限內,則將其傳回為最佳解。方法 ‘trf’ 執行 [STIR] 中描述的演算法改編,用於線性最小平方問題。迭代基本上與非線性最小平方演算法相同,但由於二次函數模型始終準確,因此我們不需要追蹤或修改信任域的半徑。當選取的步驟沒有減少成本函數時,線搜尋(回溯)會作為安全網使用。請在
scipy.optimize.least_squares
中閱讀演算法的更詳細描述。方法 ‘bvls’ 執行 [BVLS] 中描述的演算法的 Python 實作。該演算法維護變數的主動集和自由集,在每次迭代中選擇一個新變數從主動集移動到自由集,然後求解自由變數上的無約束最小平方問題。此演算法保證最終給出準確的解,但對於具有 n 個變數的問題,可能需要最多 n 次迭代。此外,還實作了一個特設的初始化程序,該程序確定最初要設定為自由或活動狀態的變數。它在實際 BVLS 開始之前需要一些迭代,但可以顯著減少後續迭代的次數。
參考文獻
[STIR]M. A. Branch、T. F. Coleman 和 Y. Li,“大規模邊界約束最小化問題的子空間、內點和共軛梯度法”,SIAM Journal on Scientific Computing,第 21 卷,第 1 期,第 1-23 頁,1999 年。
[BVLS]P. B. Start 和 R. L. Parker,“有界變數最小平方:一種演算法和應用”,Computational Statistics,10,129-141,1995 年。
範例
在此範例中,求解了一個具有大型稀疏矩陣和變數界限的問題。
>>> import numpy as np >>> from scipy.sparse import rand >>> from scipy.optimize import lsq_linear >>> rng = np.random.default_rng() ... >>> m = 2000 >>> n = 1000 ... >>> A = rand(m, n, density=1e-4, random_state=rng) >>> b = rng.standard_normal(m) ... >>> lb = rng.standard_normal(n) >>> ub = lb + 1 ... >>> res = lsq_linear(A, b, bounds=(lb, ub), lsmr_tol='auto', verbose=1) The relative change of the cost function is less than `tol`. Number of iterations 10, initial cost 1.0070e+03, final cost 9.6602e+02, first-order optimality 2.21e-09. # may vary