2016-07-17 67 views

Odpowiedz

5

Jest to metoda rvs wyciągnął z https://github.com/scipy/scipy/pull/5622/files, z minimalną zmianą - wystarczy uruchomić jako samodzielna funkcja numpy.

import numpy as np  

def rvs(dim=3): 
    random_state = np.random 
    H = np.eye(dim) 
    D = np.ones((dim,)) 
    for n in range(1, dim): 
     x = random_state.normal(size=(dim-n+1,)) 
     D[n-1] = np.sign(x[0]) 
     x[0] -= D[n-1]*np.sqrt((x*x).sum()) 
     # Householder transformation 
     Hx = (np.eye(dim-n+1) - 2.*np.outer(x, x)/(x*x).sum()) 
     mat = np.eye(dim) 
     mat[n-1:, n-1:] = Hx 
     H = np.dot(H, mat) 
     # Fix the last sign such that the determinant is 1 
    D[-1] = (-1)**(1-(dim % 2))*D.prod() 
    # Equivalent to np.dot(np.diag(D), H) but faster, apparently 
    H = (D*H.T).T 
    return H 

Dopasowuje testu Warren, https://stackoverflow.com/a/38426572/901925

13

Wersja 0.18 scipy ma scipy.stats.ortho_group i scipy.stats.special_ortho_group. Żądanie ciągnąć gdzie została dodana jest https://github.com/scipy/scipy/pull/5622

Na przykład

In [24]: from scipy.stats import ortho_group # Requires version 0.18 of scipy 

In [25]: m = ortho_group.rvs(dim=3) 

In [26]: m 
Out[26]: 
array([[-0.23939017, 0.58743526, -0.77305379], 
     [ 0.81921268, -0.30515101, -0.48556508], 
     [-0.52113619, -0.74953498, -0.40818426]]) 

In [27]: np.set_printoptions(suppress=True) 

In [28]: m.dot(m.T) 
Out[28]: 
array([[ 1., 0., -0.], 
     [ 0., 1., 0.], 
     [-0., 0., 1.]]) 
+0

Dziękuję za odpowiedź. Zauważyłem, że podane odpowiedzi dotyczą wyłącznie macierzy kwadratowych. Czy nadal mogę użyć tej metody do uzyskania macierzy d x k, gdzie k Dacion

7

można uzyskać losową n x n ortogonalną macierz Q, (rozmieszczone równomiernie kolektora n x n macierzy ortogonalnych) przeprowadzając QR faktoryzacji w n x n matrycy z elementami i.i.d. Zmienne losowe Gaussa o średniej 0 i wariancji 1. Oto przykład:

import numpy as np 
from scipy.linalg import qr 

n = 3 
H = np.random.randn(n, n) 
Q, R = qr(H) 

print (Q.dot(Q.T)) 
[[ 1.00000000e+00 -2.77555756e-17 2.49800181e-16] 
[ -2.77555756e-17 1.00000000e+00 -1.38777878e-17] 
[ 2.49800181e-16 -1.38777878e-17 1.00000000e+00]] 
0

jeśli chcesz żaden macierzy kwadratowej z ortonormalnych wektorów kolumnowych można utworzyć kwadrat jeden z którymkolwiek z wymienionych metod i upuść kilka kolumn.

Powiązane problemy