2016-07-17 17 views

答えて

5

これはrvs方法は、最小限の変更で、https://github.com/scipy/scipy/pull/5622/filesから引っ張られ、例えばhttps://github.com/scipy/scipy/pull/5622

です。

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 

それはあなたの要素とn x nマトリックスのQR分解を行うことにより、ランダムn x n直交行列Q、(均一n x n直交行列のマニホールドにわたって分布)を得ることができるウォーレンの試験、https://stackoverflow.com/a/38426572/901925

13

scipyのバージョン0.18はscipy.stats.ortho_groupscipy.stats.special_ortho_groupです。ちょうど十分なスタンドアローンnumpyの機能として実行する - それが追加されたプルリクエストは

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

ありがとうございます。私は与えられた答えがすべて正方行列であることに気付いた。この方法を使ってd x k行列を得ることはできますか?k Dacion

7

に一致i.i.d.平均0および分散1のガウス確率変数。次に例を示します。

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

あなたは正規直交列ベクトルとどれも正方行列を希望しない場合は、あなたが言及した方法のいずれかの正方形を作成し、いくつかの列をドロップすることができます。

関連する問題