svds(solver=’propack’)#
- scipy.sparse.linalg.svds(A, k=6, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack', rng=None, options=None)
Partielle singuläre Wertzerlegung einer dünnbesetzten Matrix mittels PROPACK.
Berechnet die größten oder kleinsten k Singulärwerte und die zugehörigen Singulärvektoren einer dünnbesetzten Matrix A. Die Reihenfolge, in der die Singulärwerte zurückgegeben werden, ist nicht garantiert.
In den folgenden Beschreibungen sei
M, N = A.shape.- Parameter:
- Adünnbesetzte Matrix oder LinearOperator
Zu zerlegende Matrix. Wenn A ein
LinearOperator-Objekt ist, muss es sowohlmatvec- als auchrmatvec-Methoden definieren.- kint, Standardwert: 6
Anzahl der zu berechnenden singulären Werte und singulären Vektoren. Muss
1 <= k <= min(M, N)erfüllen.- ncvint, optional
Ignoriert.
- tolfloat, optional
Die gewünschte relative Genauigkeit für die berechneten singulären Werte. Null (Standard) bedeutet maschinelle Präzision.
- which{‘LM’, ‘SM’}
Welche k singulären Werte gefunden werden sollen: entweder die mit der größten Magnitude (`'LM'`) oder die mit der kleinsten Magnitude (`'SM'`). Beachten Sie, dass die Wahl von
which='SM'die OptionirlaufTruesetzt.- v0ndarray, optional
Startvektor für Iterationen: muss die Länge
A.shape[0]haben. Wenn nicht angegeben, generiert PROPACK einen Startvektor.- maxiterint, optional
Maximale Anzahl von Iterationen / maximale Dimension des Krylov-Unterraums. Standard ist
10 * k.- return_singular_vectors{True, False, “u”, “vh”}
Singulärwerte werden immer berechnet und zurückgegeben; dieser Parameter steuert die Berechnung und Rückgabe von Singulärvektoren.
True: Singulärvektoren zurückgeben.False: keine Singulärvektoren zurückgeben."u": berechnet nur die linken singulären Vektoren; gibtNonefür die rechten singulären Vektoren zurück."vh": berechnet nur die rechten singulären Vektoren; gibtNonefür die linken singulären Vektoren zurück.
- solver{‘arpack’, ‘propack’, ‘lobpcg’}, optional
Dies ist die Solver-spezifische Dokumentation für
solver='propack'. (`'arpack'`) und (`'lobpcg'`) werden ebenfalls unterstützt.- rng
numpy.random.Generator, optional Pseudozufallszahlengenerator-Zustand. Wenn rng None ist, wird ein neuer
numpy.random.Generatorunter Verwendung von Entropie aus dem Betriebssystem erstellt. Typen, die keinenumpy.random.Generatorsind, werden annumpy.random.default_rngübergeben, um einenGeneratorzu instanziieren.- optionsdict, optional
Ein Wörterbuch mit Solver-spezifischen Optionen. Derzeit werden keine Solver-spezifischen Optionen unterstützt; dieser Parameter ist für die zukünftige Verwendung reserviert.
- Rückgabe:
- undarray, Form=(M, k)
Unitäre Matrix mit linken Singulärvektoren als Spalten.
- sndarray, Form=(k,)
Die Singulärwerte.
- vhndarray, Form=(k, N)
Unitäre Matrix mit rechten Singulärvektoren als Zeilen.
Hinweise
Dies ist eine Schnittstelle zur Fortran-Bibliothek PROPACK [1]. Die aktuelle Standardeinstellung ist die Ausführung mit deaktiviertem IRL-Modus, es sei denn, Sie suchen nach den kleinsten singulären Werten/Vektoren (
which='SM').Referenzen
[1]Larsen, Rasmus Munk. „PROPACK-Software für große und dünnbesetzte SVD-Berechnungen.“ Online verfügbar. URL http://sun.stanford.edu/~rmunk/PROPACK (2004): 2008-2009.
Beispiele
Erstellt eine Matrix
Aaus Singulärwerten und -vektoren.>>> import numpy as np >>> from scipy.stats import ortho_group >>> from scipy.sparse import csc_array, diags_array >>> from scipy.sparse.linalg import svds >>> rng = np.random.default_rng() >>> orthogonal = csc_array(ortho_group.rvs(10, random_state=rng)) >>> s = [0.0001, 0.001, 3, 4, 5] # singular values >>> u = orthogonal[:, :5] # left singular vectors >>> vT = orthogonal[:, 5:].T # right singular vectors >>> A = u @ diags_array(s) @ vT
Mit nur drei Singulärwerten/-vektoren approximiert die SVD die ursprüngliche Matrix.
>>> u2, s2, vT2 = svds(A, k=3, solver='propack') >>> A2 = u2 @ np.diag(s2) @ vT2 >>> np.allclose(A2, A.todense(), atol=1e-3) True
Mit allen fünf Singulärwerten/-vektoren können wir die ursprüngliche Matrix reproduzieren.
>>> u3, s3, vT3 = svds(A, k=5, solver='propack') >>> A3 = u3 @ np.diag(s3) @ vT3 >>> np.allclose(A3, A.todense()) True
Die Singulärwerte stimmen mit den erwarteten Singulärwerten überein, und die Singulärvektoren sind bis auf einen Vorzeichenunterschied wie erwartet.
>>> (np.allclose(s3, s) and ... np.allclose(np.abs(u3), np.abs(u.toarray())) and ... np.allclose(np.abs(vT3), np.abs(vT.toarray()))) True
Die Singulärvektoren sind ebenfalls orthogonal.
>>> (np.allclose(u3.T @ u3, np.eye(5)) and ... np.allclose(vT3 @ vT3.T, np.eye(5))) True