scipy.linalg.

svd#

scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[Quelle]#

Singulärwertzerlegung.

Zerlegt die Matrix a in zwei unitäre Matrizen U und Vh sowie ein 1D-Array s von Singulärwerten (reell, nicht-negativ) so, dass a == U @ S @ Vh gilt, wobei S eine passend geformte Nullmatrix mit der Hauptdiagonale s ist.

Die Dokumentation wurde unter der Annahme verfasst, dass die Array-Argumente bestimmte „Kern“-Formen haben. Array-Argumente dieser Funktion können jedoch zusätzliche „Batch“-Dimensionen vorangestellt haben. In diesem Fall wird das Array als Stapel von niedrigdimensionalen Schnitten behandelt; siehe Gestapelte lineare Operationen für Details.

Parameter:
a(M, N) array_like

Zu zerlegende Matrix.

full_matricesbool, optional

Wenn True (Standard), haben U und Vh die Formen (M, M) bzw. (N, N). Wenn False, sind die Formen (M, K) und (K, N), wobei K = min(M, N).

compute_uvbool, optional

Ob auch U und Vh zusätzlich zu s berechnet werden sollen. Standard ist True.

overwrite_abool, optional

Ob a überschrieben werden soll; kann die Leistung verbessern. Standard ist False.

check_finitebool, optional

Ob überprüft werden soll, ob die Eingabematrix nur endliche Zahlen enthält. Das Deaktivieren kann zu einer Leistungssteigerung führen, kann aber zu Problemen (Abstürze, Nichtterminierung) führen, wenn die Eingaben Unendlichkeiten oder NaNs enthalten.

lapack_driver{‘gesdd’, ‘gesvd’}, optional

Ob der effizientere Divide-and-Conquer-Ansatz ('gesdd') oder der allgemeine rechteckige Ansatz ('gesvd') zur Berechnung der SVD verwendet werden soll. MATLAB und Octave verwenden den 'gesvd'-Ansatz. Standard ist 'gesdd'.

Rückgabe:
Undarray

Unitäre Matrix mit linken Singulärvektoren als Spalten. Form (M, M) oder (M, K), abhängig von full_matrices.

sndarray

Die Singulärwerte, sortiert in nicht-zunehmender Reihenfolge. Form (K,), mit K = min(M, N).

Vhndarray

Unitäre Matrix mit rechten Singulärvektoren als Zeilen. Form (N, N) oder (K, N), abhängig von full_matrices.

Für compute_uv=False wird nur s zurückgegeben.
Löst aus:
LinAlgError

Wenn die SVD-Berechnung nicht konvergiert.

Siehe auch

svdvals

Berechnet die Singulärwerte einer Matrix.

diagsvd

Konstruiert die Sigma-Matrix aus dem Vektor s.

Beispiele

>>> import numpy as np
>>> from scipy import linalg
>>> rng = np.random.default_rng()
>>> m, n = 9, 6
>>> a = rng.standard_normal((m, n)) + 1.j*rng.standard_normal((m, n))
>>> U, s, Vh = linalg.svd(a)
>>> U.shape,  s.shape, Vh.shape
((9, 9), (6,), (6, 6))

Rekonstruiert die ursprüngliche Matrix aus der Zerlegung

>>> sigma = np.zeros((m, n))
>>> for i in range(min(m, n)):
...     sigma[i, i] = s[i]
>>> a1 = np.dot(U, np.dot(sigma, Vh))
>>> np.allclose(a, a1)
True

Alternativ kann full_matrices=False verwendet werden (beachten Sie, dass die Form von U dann (m, n) statt (m, m) ist).

>>> U, s, Vh = linalg.svd(a, full_matrices=False)
>>> U.shape, s.shape, Vh.shape
((9, 6), (6,), (6, 6))
>>> S = np.diag(s)
>>> np.allclose(a, np.dot(U, np.dot(S, Vh)))
True
>>> s2 = linalg.svd(a, compute_uv=False)
>>> np.allclose(s, s2)
True