में सहसंबंधित डेटा उत्पन्न करें आर में एक फ़ंक्शन (cm.rnorm.cor
, पैकेज CreditMetrics
से) है, जो सहसंबंधित डेटा बनाने के लिए नमूनों की मात्रा, चर की मात्रा और एक सहसंबंध मैट्रिक्स लेता है।पायथन (3.3)
क्या पाइथन में समतुल्य है?
में सहसंबंधित डेटा उत्पन्न करें आर में एक फ़ंक्शन (cm.rnorm.cor
, पैकेज CreditMetrics
से) है, जो सहसंबंधित डेटा बनाने के लिए नमूनों की मात्रा, चर की मात्रा और एक सहसंबंध मैट्रिक्स लेता है।पायथन (3.3)
क्या पाइथन में समतुल्य है?
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()
परिणाम:
भी देखें CorrelatedRandomSamples SciPy कुकबुक में।
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()
संदर्भ: 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()
आप देख सकते हैं, सहसंबंध गुणांक 0.2 के पास आम तौर पर कर रहे हैं, लेकिन किसी भी नमूने के लिए, सह-संबंध सबसे अधिक संभावना नहीं 0.2 वास्तव में हो जाएगा ।
क्या आप जानते हैं कि डेटा को वास्तव में एक सहसंबंध होने के लिए कैसे प्राप्त करें, कहें, 0.2 (एक छोटी सहिष्णुता के साथ)? – PascalVKooten
या यह पहले से ही सही है? – PascalVKooten
हुड के नीचे 'numpy.random.multivariate_normal' क्या कर रहा है? क्योंकि मैंने पूर्व की तुलना में चोटी के दृष्टिकोण से तुलना की और बाद में पाया कि बाद में बड़े आयामी डेटा (कुछ हज़ारों) के लिए। क्या cholesky दृष्टिकोण केवल कुछ specfic प्रकार के covariance मैट्रिक्स के लिए काम करता है? मेरा कॉव-मैट्रिक्स केवल विकर्ण, या बहुत विचित्र है। – Jason
क्षमा करें, मेरा बुरा, पायथन 3.3 पर। – PascalVKooten
व्हाट ... समर्थन वास्तव में हाल ही में जोड़ा गया है! मुझे याद दिलाने के लिये धन्यवाद। – PascalVKooten
ब्लेंडर से पैकेज के महान संग्रह के बगल में, कम हास्यवादी स्वर पर, डुएलिटी, मैं वास्तव में सुझाव देता हूं कि आप पाइथन (एक्स, वाई) का प्रयास करें। यह वैज्ञानिक विकास के लिए पायथन पैकेज का संग्रह है + आईपीथन + ग्रेट आईडीई जिसे स्पाइडर कहा जाता है। http://code.google.com/p/pythonxy/ – Oz123