Rには相関データを作成するためのサンプル量、変数量、および相関行列を取る関数(cm.rnorm.cor
、パッケージCreditMetrics
)があります。Python(3.3)で相関データを生成
Pythonには同等の機能はありますか?
Rには相関データを作成するためのサンプル量、変数量、および相関行列を取る関数(cm.rnorm.cor
、パッケージCreditMetrics
)があります。Python(3.3)で相関データを生成
Pythonには同等の機能はありますか?
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()
結果:
はscipyのダウンロードクックブックにもCorrelatedRandomSamples参照してください。
あなたはL L^T
に共分散行列C
をコレスキー分解し、 独立したランダムベクトル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()
参考:あなたは2つのシリーズ、X
とY
を生成する場合、特定の(Pearson) correlation coefficient(例えば0.2)で、Cholesky decomposition
を参照してください:
rho = cov(X,Y)/sqrt(var(X)*var(Y))
あなたは、共分散行列が
cov = [[1, 0.2],
[0.2, 1]]
これは
cov(X,Y) = 0.2
を行い
、および分散、var(X)
と1に等しいの両方var(Y)
のでrho
が0.2に等しくなるように選択することができます。
たとえば、以下の例では、相関した一連のペア(X
およびY
)を1000回生成します。あなたが見ることができるように、相関係数が0.2に近い一般的ですが、任意の与えられた試料のために、相関が最も可能性の高い、正確に0.2ではありません
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の相関があるようにする方法を知っていますか(小さな公差のように)? – PascalVKooten
これは既に正確ですか? – PascalVKooten
フードの中で 'numpy.random.multivariate_normal'とは何ですか?なぜなら私は前者をコレスキー的アプローチと比較して、後者は特に数千のようなより大きな次元のデータの方がはるかに高速であることが分かったからです。コレスキーアプローチは、特定の種類の共分散行列に対してのみ機能しますか?私のcov-matrixは対角線にすぎないか、非常にまばらです。 – Jason
申し訳ありませんが、私の悪い、Python 3.3。 – PascalVKooten
Whaaat ...サポートが最近追加されました!私に思い出させてくれてありがとう。 – PascalVKooten
@Dualinity、ユーモアがありません。Blenderの素晴らしいパッケージの横に、Python(X、Y)を試してみることをお勧めします。これは、科学的開発のためのPythonパッケージのコレクション+ IPython + SpyderというGreat IDEです。 http://code.google.com/p/pythonxy/ – Oz123