2013-04-15 9 views
5

में सहसंबंधित डेटा उत्पन्न करें आर में एक फ़ंक्शन (cm.rnorm.cor, पैकेज CreditMetrics से) है, जो सहसंबंधित डेटा बनाने के लिए नमूनों की मात्रा, चर की मात्रा और एक सहसंबंध मैट्रिक्स लेता है।पायथन (3.3)

क्या पाइथन में समतुल्य है?

+0

क्षमा करें, मेरा बुरा, पायथन 3.3 पर। – PascalVKooten

+0

व्हाट ... समर्थन वास्तव में हाल ही में जोड़ा गया है! मुझे याद दिलाने के लिये धन्यवाद। – PascalVKooten

+0

ब्लेंडर से पैकेज के महान संग्रह के बगल में, कम हास्यवादी स्वर पर, डुएलिटी, मैं वास्तव में सुझाव देता हूं कि आप पाइथन (एक्स, वाई) का प्रयास करें। यह वैज्ञानिक विकास के लिए पायथन पैकेज का संग्रह है + आईपीथन + ग्रेट आईडीई जिसे स्पाइडर कहा जाता है। http://code.google.com/p/pythonxy/ – Oz123

उत्तर

9

numpy.random.multivariate_normal वह कार्य है जो आप चाहते हैं।

उदाहरण:

import numpy as np 
import matplotlib.pyplot as plt 


num_samples = 400 

# The desired mean values of the sample. 
mu = np.array([5.0, 0.0, 10.0]) 

# The desired covariance matrix. 
r = np.array([ 
     [ 3.40, -2.75, -2.00], 
     [ -2.75, 5.50, 1.50], 
     [ -2.00, 1.50, 1.25] 
    ]) 

# Generate the random samples. 
y = np.random.multivariate_normal(mu, r, size=num_samples) 


# Plot various projections of the samples. 
plt.subplot(2,2,1) 
plt.plot(y[:,0], y[:,1], 'b.') 
plt.plot(mu[0], mu[1], 'ro') 
plt.ylabel('y[1]') 
plt.axis('equal') 
plt.grid(True) 

plt.subplot(2,2,3) 
plt.plot(y[:,0], y[:,2], 'b.') 
plt.plot(mu[0], mu[2], 'ro') 
plt.xlabel('y[0]') 
plt.ylabel('y[2]') 
plt.axis('equal') 
plt.grid(True) 

plt.subplot(2,2,4) 
plt.plot(y[:,1], y[:,2], 'b.') 
plt.plot(mu[1], mu[2], 'ro') 
plt.xlabel('y[1]') 
plt.axis('equal') 
plt.grid(True) 

plt.show() 

परिणाम:

enter image description here

भी देखें CorrelatedRandomSamples SciPy कुकबुक में।

5

L L^T में एक सहप्रसरण मैट्रिक्स C Cholesky-विघटित, और एक स्वतंत्र यादृच्छिक वेक्टर x उत्पन्न आप हैं, तो Lx सहप्रसरण C साथ एक यादृच्छिक वेक्टर हो जाएगा।

import numpy as np 
import matplotlib.pyplot as plt 
linalg = np.linalg 
np.random.seed(1) 

num_samples = 1000 
num_variables = 2 
cov = [[0.3, 0.2], [0.2, 0.2]] 

L = linalg.cholesky(cov) 
# print(L.shape) 
# (2, 2) 
uncorrelated = np.random.standard_normal((num_variables, num_samples)) 
mean = [1, 1] 
correlated = np.dot(L, uncorrelated) + np.array(mean).reshape(2, 1) 
# print(correlated.shape) 
# (2, 1000) 
plt.scatter(correlated[0, :], correlated[1, :], c='green') 
plt.show() 

enter image description here

संदर्भ: Cholesky decomposition


देखें आप दो श्रृंखला, X और Y उत्पन्न करने के लिए चाहते हैं, एक विशेष (Pearson) correlation coefficient (0.2 जैसे) के साथ:

rho = cov(X,Y)/sqrt(var(X)*var(Y)) 

आप चुन सकते हैं सहप्रसरण मैट्रिक्स

cov = [[1, 0.2], 
     [0.2, 1]] 

यह cov(X,Y) = 0.2 बनाता है, और प्रसरण, var(X) और var(Y) दोनों 1. के बराबर तो rho 0.2 के बराबर होता है किया जाना है।

उदाहरण के लिए, नीचे हम सहसंबंधित श्रृंखला के जोड़े, X और Y, 1000 बार उत्पन्न करते हैं। फिर हम सहसंबंध गुणांक की एक हिस्टोग्राम साजिश:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats as stats 
linalg = np.linalg 
np.random.seed(1) 

num_samples = 1000 
num_variables = 2 
cov = [[1.0, 0.2], [0.2, 1.0]] 

L = linalg.cholesky(cov) 

rhos = [] 
for i in range(1000): 
    uncorrelated = np.random.standard_normal((num_variables, num_samples)) 
    correlated = np.dot(L, uncorrelated) 
    X, Y = correlated 
    rho, pval = stats.pearsonr(X, Y) 
    rhos.append(rho) 

plt.hist(rhos) 
plt.show() 

enter image description here

आप देख सकते हैं, सहसंबंध गुणांक 0.2 के पास आम तौर पर कर रहे हैं, लेकिन किसी भी नमूने के लिए, सह-संबंध सबसे अधिक संभावना नहीं 0.2 वास्तव में हो जाएगा ।

+0

क्या आप जानते हैं कि डेटा को वास्तव में एक सहसंबंध होने के लिए कैसे प्राप्त करें, कहें, 0.2 (एक छोटी सहिष्णुता के साथ)? – PascalVKooten

+0

या यह पहले से ही सही है? – PascalVKooten

+0

हुड के नीचे 'numpy.random.multivariate_normal' क्या कर रहा है? क्योंकि मैंने पूर्व की तुलना में चोटी के दृष्टिकोण से तुलना की और बाद में पाया कि बाद में बड़े आयामी डेटा (कुछ हज़ारों) के लिए। क्या cholesky दृष्टिकोण केवल कुछ specfic प्रकार के covariance मैट्रिक्स के लिए काम करता है? मेरा कॉव-मैट्रिक्स केवल विकर्ण, या बहुत विचित्र है। – Jason

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