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 sowohl matvec- als auch rmatvec-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 Option irl auf True setzt.

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; gibt None für die rechten singulären Vektoren zurück.

  • "vh": berechnet nur die rechten singulären Vektoren; gibt None fü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.

rngnumpy.random.Generator, optional

Pseudozufallszahlengenerator-Zustand. Wenn rng None ist, wird ein neuer numpy.random.Generator unter Verwendung von Entropie aus dem Betriebssystem erstellt. Typen, die keine numpy.random.Generator sind, werden an numpy.random.default_rng übergeben, um einen Generator zu 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 A aus 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