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
UundVhsowie ein 1D-Arraysvon Singulärwerten (reell, nicht-negativ) so, dassa == U @ S @ Vhgilt, wobeiSeine passend geformte Nullmatrix mit der Hauptdiagonalesist.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), wobeiK = min(M, N).- compute_uvbool, optional
Ob auch
UundVhzusätzlich zusberechnet 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=Falsewird nurszurückgegeben.
- Löst aus:
- LinAlgError
Wenn die SVD-Berechnung nicht konvergiert.
Siehe auch
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=Falseverwendet werden (beachten Sie, dass die Form vonUdann(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