2016-07-17 57 views
10

क्या कोई तरीका है जिसे मैं पाइथन में यादृच्छिक ऑर्थोनॉर्मल मैट्रिक्स बनाने के लिए कॉल कर सकता हूं? शायद numpy का उपयोग कर? या कई numpy तरीकों का उपयोग कर एक ऑर्थोनॉर्मल मैट्रिक्स बनाने का कोई तरीका है? धन्यवाद।पायथन numpy में यादृच्छिक orthonormal मैट्रिक्स कैसे बनाएँ

उत्तर

5

यह rvs विधि https://github.com/scipy/scipy/pull/5622/files से खींच लिया, कम से कम परिवर्तन के साथ है - योग्य स्वतंत्र 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 

यह वॉरेन परीक्षण से मेल खाता है, https://stackoverflow.com/a/38426572/901925

13

एससीपीई के संस्करण 0.18 में scipy.stats.ortho_group और scipy.stats.special_ortho_group है। पुल अनुरोध जहां यह जोड़ा गया है https://github.com/scipy/scipy/pull/5622

उदाहरण के लिए है,

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

आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने देखा है कि दिए गए उत्तर स्क्वायर मैट्रिस के लिए हैं। क्या मैं अभी भी डी एक्स के मैट्रिक्स प्राप्त करने के लिए इस विधि का उपयोग कर सकता हूं, जहां k Dacion

7

आप एक यादृच्छिक n x n orthogonal मैट्रिक्स Q, (समान रूप से n x n orthogonal मैट्रिक्स के कई गुना पर वितरित) तत्वों के साथ एक n x n मैट्रिक्स की एक QR गुणन प्रदर्शन से प्राप्त कर सकते हैं 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

अगर आप चाहते हैं एक कोई भी orthonormal स्तंभ वैक्टर के साथ वर्ग मैट्रिक्स आपको वर्ग में उल्लेख किया विधि से किसी के साथ एक बना सकते हैं और कुछ कॉलम ड्रॉप कर सकते हैं।

संबंधित मुद्दे