scipy.linalg.

orthogonal_procrustes#

scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[Quelle]#

Berechnet die Matrixlösung des orthogonalen (oder unitären) Procrustes-Problems.

Gegeben sind Matrizen A und B gleicher Form. Findet eine orthogonale (oder unitäre im Fall von komplexen Eingaben) Matrix R, die A am besten auf B abbildet, unter Verwendung des Algorithmus aus [1].

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

Matrix, die abgebildet werden soll.

B(M, N) array_like

Zielmatrix.

check_finitebool, optional

Ob überprüft werden soll, ob die Eingabematrizen nur endliche Zahlen enthalten. Das Deaktivieren kann zu einer Leistungssteigerung führen, kann aber zu Problemen (Abstürzen, Nicht-Terminierung) führen, wenn die Eingaben Unendlichkeiten oder NaNs enthalten.

Rückgabe:
R(N, N) ndarray

Die Matrixlösung des orthogonalen Procrustes-Problems. Minimiert die Frobenius-Norm von (A @ R) - B, unter der Bedingung R.conj().T @ R = I.

scaleGleitkommazahl

Summe der Singulärwerte von A.conj().T @ B.

Löst aus:
ValueError

Wenn die Formen der Eingabearrays nicht übereinstimmen oder wenn check_finite True ist und die Arrays Inf oder NaN enthalten.

Hinweise

Beachten Sie, dass diese Funktion im Gegensatz zu höherstufigen Procrustes-Analysen von räumlichen Daten nur orthogonale Transformationen wie Rotationen und Spiegelungen verwendet und keine Skalierung oder Translation.

Hinzugefügt in Version 0.15.0.

Referenzen

[1]

Peter H. Schonemann, „A generalized solution of the orthogonal Procrustes problem“, Psychometrica – Vol. 31, No. 1, März 1966. DOI:10.1007/BF02289451

Beispiele

>>> import numpy as np
>>> from scipy.linalg import orthogonal_procrustes
>>> A = np.array([[ 2,  0,  1], [-2,  0,  0]])

Drehen Sie die Reihenfolge der Spalten und prüfen Sie auf die Anti-Diagonal-Abbildung

>>> R, sca = orthogonal_procrustes(A, np.fliplr(A))
>>> R
array([[-5.34384992e-17,  0.00000000e+00,  1.00000000e+00],
       [ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00],
       [ 1.00000000e+00,  0.00000000e+00, -7.85941422e-17]])
>>> sca
9.0

Als Beispiel für das unitäre Procrustes-Problem generieren Sie eine zufällige komplexe Matrix A, eine zufällige unitäre Matrix Q und ihr Produkt B.

>>> shape = (4, 4)
>>> rng = np.random.default_rng()
>>> A = rng.random(shape) + rng.random(shape)*1j
>>> Q = rng.random(shape) + rng.random(shape)*1j
>>> Q, _ = np.linalg.qr(Q)
>>> B = A @ Q

orthogonal_procrustes stellt die unitäre Matrix Q aus A und B wieder her.

>>> R, _ = orthogonal_procrustes(A, B)
>>> np.allclose(R, Q)
True