scipy.optimize.

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),其中 mn 分別是 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.lstsqscipy.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