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)[Quelle]#
Löst ein lineares Kleinste-Quadrate-Problem mit Beschränkungen für die Variablen.
Gegeben eine m-mal-n-Designmatrix A und ein Zielvektor b mit m Elementen, löst
lsq_lineardas folgende Optimierungsproblemminimize 0.5 * ||A x - b||**2 subject to lb <= x <= ub
Dieses Optimierungsproblem ist konvex, daher ist ein gefundenes Minimum (falls die Iterationen konvergiert sind) garantiert global.
- Parameter:
- Aarray_like, sparse array oder LinearOperator, Form (m, n)
Designmatrix. Kann ein
scipy.sparse.linalg.LinearOperatorsein.- barray_like, shape (m,)
Zielvektor.
- bounds2-Tupel aus array_like oder
Bounds, optional Untere und obere Schranken für die Parameter. Standardmäßig keine Schranken. Es gibt zwei Möglichkeiten, die Schranken anzugeben
Instanz der Klasse
Bounds.2-Tupel aus array_like: Jedes Element des Tupels muss entweder ein Array mit der Länge gleich der Anzahl der Parameter oder ein Skalar sein (in diesem Fall wird die Schranke für alle Parameter gleich angenommen). Verwenden Sie
np.infmit dem entsprechenden Vorzeichen, um Schranken für alle oder einige Parameter zu deaktivieren.
- method‘trf’ oder ‘bvls’, optional
Methode zur Durchführung der Minimierung.
‘trf’ : Trust Region Reflective-Algorithmus, angepasst für ein lineares Kleinste-Quadrate-Problem. Dies ist eine Methode vom Typ Interior-Point, und die benötigte Anzahl von Iterationen ist schwach mit der Anzahl der Variablen korreliert.
‘bvls’ : Bounded-variable least-squares-Algorithmus. Dies ist eine Active-Set-Methode, die eine Anzahl von Iterationen benötigt, die mit der Anzahl der Variablen vergleichbar ist. Kann nicht verwendet werden, wenn A spärlich oder ein LinearOperator ist.
Standard ist ‘trf’.
- tolfloat, optional
Toleranzparameter. Der Algorithmus endet, wenn die relative Änderung der Kostenfunktion in der letzten Iteration kleiner als tol ist. Zusätzlich wird das Maß der Erstordnung-Optimalität berücksichtigt
method='trf'endet, wenn die uniforme Norm des Gradienten, skaliert zur Berücksichtigung der Schranken, kleiner als tol ist.method='bvls'endet, wenn die Karush-Kuhn-Tucker-Bedingungen innerhalb einer Toleranz von tol erfüllt sind.
- lsq_solver{None, ‘exact’, ‘lsmr’}, optional
Methode zum Lösen von unbeschränkten Kleinste-Quadrate-Problemen während der Iterationen
‘exact’ : Verwenden Sie eine dichte QR- oder SVD-Zerlegung. Kann nicht verwendet werden, wenn A spärlich oder ein LinearOperator ist.
‘lsmr’ : Verwenden Sie das iterative Verfahren
scipy.sparse.linalg.lsmr, das nur Matrix-Vektor-Produktauswertungen benötigt. Kann nicht mitmethod='bvls'verwendet werden.
Wenn None (Standard), wird der Solver basierend auf dem Typ von A ausgewählt.
- lsmr_tolNone, float oder ‘auto’, optional
Toleranzparameter ‘atol’ und ‘btol’ für
scipy.sparse.linalg.lsmr. Wenn None (Standard), wird er auf1e-2 * tolgesetzt. Wenn ‘auto’, wird die Toleranz basierend auf der Optimalität des aktuellen Iteranden angepasst, was den Optimierungsprozess beschleunigen kann, aber nicht immer zuverlässig ist.- max_iterNone oder int, optional
Maximale Anzahl von Iterationen vor dem Abbruch. Wenn None (Standard), wird sie auf 100 für
method='trf'oder auf die Anzahl der Variablen fürmethod='bvls'gesetzt (ohne Iterationen für die 'bvls'-Initialisierung).- verbose{0, 1, 2}, optional
Level der Ausführlichkeit des Algorithmus
0 : still arbeiten (Standard).
1 : zeigt einen Beendigungsbericht an.
2 : Fortschritt während der Iterationen anzeigen.
- lsmr_maxiterNone oder int, optional
Maximale Anzahl von Iterationen für den lsmr-Kleinste-Quadrate-Solver, falls er verwendet wird (durch Setzen von
lsq_solver='lsmr'). Wenn None (Standard), verwendet er den lsmr-Standard vonmin(m, n), wobeimundndie Anzahl der Zeilen und Spalten von A sind. Hat keine Auswirkung, wennlsq_solver='exact'.
- Rückgabe:
- OptimizeResult mit den folgenden Feldern:
- xndarray, Form (n,)
Gefundene Lösung.
- costfloat
Wert der Kostenfunktion an der Lösung.
- funndarray, Form (m,)
Vektor der Residuen an der Lösung.
- optimalityfloat
Maß der Erstordnung-Optimalität. Die genaue Bedeutung hängt von method ab; siehe die Beschreibung des tol-Parameters.
- active_maskndarray von int, Form (n,)
Jede Komponente zeigt an, ob eine entsprechende Einschränkung aktiv ist (d.h. ob eine Variable an der Grenze liegt)
0 : eine Einschränkung ist nicht aktiv.
-1 : eine untere Schranke ist aktiv.
1 : eine obere Schranke ist aktiv.
Kann für die Methode trf etwas willkürlich sein, da sie eine Folge von streng zulässigen Iterierten erzeugt und die active_mask innerhalb eines Toleranzschwellenwerts bestimmt wird.
- unbounded_soltuple
Unbeschränkte Kleinste-Quadrate-Lösungs-Tupel, das vom Kleinste-Quadrate-Solver zurückgegeben wird (gesetzt mit der Option lsq_solver). Wenn lsq_solver nicht gesetzt oder auf
'exact'gesetzt ist, enthält das Tupel ein ndarray der Form (n,) mit der unbeschränkten Lösung, ein ndarray mit der Summe der quadrierten Residuen, ein int mit dem Rang von A und ein ndarray mit den singulären Werten von A (siehe NumPy'slinalg.lstsqfür weitere Informationen). Wenn lsq_solver auf'lsmr'gesetzt ist, enthält das Tupel ein ndarray der Form (n,) mit der unbeschränkten Lösung, einen int mit dem Exit-Code, einen int mit der Anzahl der Iterationen und fünf Floats mit verschiedenen Normen und der Konditionszahl von A (siehe SciPy'ssparse.linalg.lsmrfür weitere Informationen). Diese Ausgabe kann nützlich sein, um die Konvergenz des Kleinste-Quadrate-Solvers zu bestimmen, insbesondere des iterativen'lsmr'-Solvers. Das unbeschränkte Kleinste-Quadrate-Problem besteht darin,0.5 * ||A x - b||**2zu minimieren.- nitint
Anzahl der Iterationen. Null, wenn die unbeschränkte Lösung optimal ist.
- statusint
Grund für die Beendigung des Algorithmus
-1 : der Algorithmus konnte in der letzten Iteration keinen Fortschritt erzielen.
0 : die maximale Anzahl von Iterationen wurde überschritten.
1 : das Maß der Erstordnung-Optimalität ist kleiner als tol.
2 : die relative Änderung der Kostenfunktion ist kleiner als tol.
3 : die unbeschränkte Lösung ist optimal.
- messagestr
Verbale Beschreibung des Abbruchgrundes.
- successbool
True, wenn eines der Konvergenzkriterien erfüllt ist (status > 0).
Siehe auch
nnlsLineare Kleinste-Quadrate mit Nicht-Negativitäts-Einschränkung.
least_squaresNichtlineare Kleinste-Quadrate mit Schranken für die Variablen.
Hinweise
Der Algorithmus berechnet zunächst die unbeschränkte Kleinste-Quadrate-Lösung mittels
numpy.linalg.lstsqoderscipy.sparse.linalg.lsmr, abhängig von lsq_solver. Diese Lösung wird als optimal zurückgegeben, wenn sie innerhalb der Schranken liegt.Die Methode 'trf' führt die Anpassung des Algorithmus aus, der in [STIR] für ein lineares Kleinste-Quadrate-Problem beschrieben ist. Die Iterationen sind im Wesentlichen die gleichen wie im Algorithmus für nichtlineare Kleinste-Quadrate, aber da das quadratische Funktionsmodell immer genau ist, müssen wir den Radius einer Vertrauensregion nicht verfolgen oder modifizieren. Die Liniensuche (Backtracking) wird als Sicherheitsnetz verwendet, wenn ein ausgewählter Schritt die Kostenfunktion nicht verringert. Eine detailliertere Beschreibung des Algorithmus finden Sie in
scipy.optimize.least_squares.Die Methode 'bvls' führt eine Python-Implementierung des Algorithmus aus, der in [BVLS] beschrieben ist. Der Algorithmus verwaltet aktive und freie Mengen von Variablen, wählt in jeder Iteration eine neue Variable aus, um von der aktiven zur freien Menge zu wechseln, und löst dann das unbeschränkte Kleinste-Quadrate-Problem für die freien Variablen. Dieser Algorithmus liefert garantiert irgendwann eine genaue Lösung, kann aber bis zu n Iterationen für ein Problem mit n Variablen benötigen. Zusätzlich ist ein Ad-hoc-Initialisierungsverfahren implementiert, das bestimmt, welche Variablen anfangs als frei oder aktiv gesetzt werden sollen. Es dauert einige Iterationen, bis BVLS tatsächlich beginnt, kann aber die Anzahl der weiteren Iterationen erheblich reduzieren.
Referenzen
[STIR]M. A. Branch, T. F. Coleman, und Y. Li, „A Subspace, Interior, and Conjugate Gradient Method for Large-Scale Bound-Constrained Minimization Problems,“ SIAM Journal on Scientific Computing, Vol. 21, Number 1, pp 1-23, 1999.
[BVLS]P. B. Start und R. L. Parker, „Bounded-Variable Least-Squares: an Algorithm and Applications“, Computational Statistics, 10, 129-141, 1995.
Beispiele
In diesem Beispiel wird ein Problem mit großen spärlichen Arrays und Schranken für die Variablen gelöst.
>>> import numpy as np >>> from scipy.sparse import random_array >>> from scipy.optimize import lsq_linear >>> rng = np.random.default_rng() ... >>> m = 2000 >>> n = 1000 ... >>> A = random_array((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