本文簡要介紹 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 withmethod='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)
其中m
和n
是行數和列數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.
相關用法
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.least_squares用法及代碼示例
- Python SciPy optimize.leastsq用法及代碼示例
- Python SciPy optimize.linprog用法及代碼示例
- Python SciPy optimize.linear_sum_assignment用法及代碼示例
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.milp用法及代碼示例
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.isotonic_regression用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.newton用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.lsq_linear。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。