當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.lsq_linear用法及代碼示例


本文簡要介紹 python 語言中 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-by-n 設計矩陣 A 和具有 m 個元素的目標向量 b,lsq_linear 解決以下優化問題:

minimize 0.5 * ||A x - b||**2
subject to lb <= x <= ub

這個優化問題是凸的,因此保證找到的最小值(如果迭代已經收斂)是全局的。

參數

A 數組,LinearOperator 的稀疏矩陣,形狀 (m, n)

設計矩陣。可以是 scipy.sparse.linalg.LinearOperator

b 數組, 形狀 (m,)

目標向量。

bounds 數組 或 Bounds 的 2 元組,可選

參數的下限和上限。默認為無限製。有兩種方法可以指定邊界:

  • Instance of Bounds class.

  • 2-tuple of array_like: Each element of the tuple must be either an array with the length equal to the number of parameters, or a scalar (in which case the bound is taken to be the same for all parameters). Use np.inf with an appropriate sign to disable bounds on all or some parameters.

method ‘trf’ 或 ‘bvls’,可選

執行最小化的方法。

  • ‘trf’ : Trust Region Reflective algorithm adapted for a linear least-squares problem. This is an interior-point-like method and the required number of iterations is weakly correlated with the number of variables.

  • ‘bvls’ : Bounded-variable least-squares algorithm. This is an active set method, which requires the number of iterations comparable to the number of variables. Can’t be used when A is sparse or LinearOperator.

默認為‘trf’。

tol 浮點數,可選

公差參數。如果成本函數的相對變化小於最後一次迭代的 tol,則算法終止。此外,還考慮了first-order 最優性度量:

  • method='trf' terminates if the uniform norm of the gradient, scaled to account for the presence of the bounds, is less than tol.

  • method='bvls' terminates if Karush-Kuhn-Tucker conditions are satisfied within tol tolerance.

lsq_solver {無,‘exact’, ‘lsmr’},可選

在整個迭代過程中求解無界最小二乘問題的方法:

  • ‘exact’ : Use dense QR or SVD decomposition approach. Can’t be used when A is sparse or LinearOperator.

  • ‘lsmr’ : Use scipy.sparse.linalg.lsmr iterative procedure which requires only matrix-vector product evaluations. Can’t be used with method='bvls'.

如果無(默認),則根據 A 的類型選擇求解器。

lsmr_tol 無,浮點數或‘auto’,可選

scipy.sparse.linalg.lsmr 的公差參數 ‘atol’ 和 ‘btol’ 如果無(默認),則設置為 1e-2 * tol 。如果‘auto’,容差將根據當前迭代的最優性進行調整,這可以加快優化過程,但並不總是可靠。

max_iter 無或整數,可選

終止前的最大迭代次數。如果為 None(默認),則將 method='trf' 設置為 100,或者將 method='bvls' 設置為變量數(不計算 ‘bvls’ 初始化的迭代次數)。

verbose {0, 1, 2},可選

算法的詳細程度:

  • 0 : work silently (default).

  • 1 : display a termination report.

  • 2 : display progress during iterations.

lsmr_maxiter 無或整數,可選

lsmr 最小二乘求解器的最大迭代次數(如果使用的話)(通過設置lsq_solver='lsmr')。如果無(默認),則使用 lsmr 的默認值min(m, n)其中mn是行數和列數A, 分別。沒有影響,如果lsq_solver='exact'.

返回

OptimizeResult 定義了以下字段:
x ndarray,形狀(n,)

找到解決方案。

cost 浮點數

解決方案的成本函數值。

fun ndarray,形狀(m,)

解處的殘差向量。

optimality 浮點數

First-order 最優性度量。具體含義取決於方法,參考 tol 參數的說明。

active_mask int的ndarray,形狀(n,)

每個組件顯示相應的約束是否處於活動狀態(即變量是否在邊界處):

  • 0 : a constraint is not active.

  • -1 : a lower bound is active.

  • 1 : an upper bound is active.

trf 方法可能有些隨意,因為它會生成一係列嚴格可行的迭代,並且 active_mask 在容差閾值內確定。

unbounded_sol 元組

最小二乘求解器返回的無界最小二乘解元組(設置為lsq_solver選項)。如果lsq_solver未設置或設置為'exact',該元組包含一個具有無界解的形狀為 (n,) 的 ndarray、一個具有殘差平方和的 ndarray、一個排名為 的 intA,以及一個具有奇異值的 ndarrayA(參見 NumPy 的linalg.lstsq了解更多信息)。如果lsq_solver被設定為'lsmr',該元組包含一個具有無界解的形狀 (n,) 的 ndarray、一個具有退出代碼的 int、一個具有迭代次數的 int 以及具有各種範數和條件數的五個浮點數A(參見 SciPy 的sparse.linalg.lsmr了解更多信息)。此輸出可用於確定最小二乘求解器的收斂性,特別是迭代求解器'lsmr'求解器。無界最小二乘問題是最小化0.5 * ||A x - b||**2.

nit int

迭代次數。如果無約束解是最優的,則為零。

status int

算法終止原因:

  • -1 : the algorithm was not able to make progress on the last iteration.

  • 0 : the maximum number of iterations is exceeded.

  • 1 : the first-order optimality measure is less than tol.

  • 2 : the relative change of the cost function is less than tol.

  • 3 : the unconstrained solution is optimal.

message str

終止原因的口頭說明。

success bool

如果滿足收斂標準之一(狀態 > 0),則為真。

注意

該算法首先計算無約束最小二乘解: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,“Large-Scale Bound-Constrained 最小化問題的子空間、內部和共軛梯度方法”,SIAM 科學計算雜誌,卷。 21,第 1 期,第 1-23 頁,1999 年。

[BVLS]

P. B. Start 和 R. L. Parker,“Bounded-Variable 最小二乘:算法和應用”,計算統計,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 = 20000
>>> n = 10000
...
>>> 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)
# may vary
The relative change of the cost function is less than `tol`.
Number of iterations 16, initial cost 1.5039e+04, final cost 1.1112e+04,
first-order optimality 4.66e-08.

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.lsq_linear。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。