如何使用 pandas 创建多元正态分布的相关矩阵?
how to use pandas to create correlation matrix of multivariate normal distribution?
在 R 中,我们可以这样创建相关矩阵:
makecov <- function(rho,n) {
m <- matrix(nrow=n,ncol=n)
m <- ifelse(row(m)==col(m),1,rho)
return(m)
}
正如我们所知的相关性,结果将是:
makecov(0.2,3)
# [,1] [,2] [,3]
#[1,] 1.0 0.2 0.2
#[2,] 0.2 1.0 0.2
#[3,] 0.2 0.2 1.0
但是在pandas中,我们如何有效地创建相同的矩阵呢?
这是我的解决方案:
def makecov(rho,n):
m=[rho/2]*n*n
m=np.array(m).reshape([n,n])
return m+m.T-np.diag([rho]*n)+np.diag([1]*n)
结果将是:
In [21]:makecov(0.2,3)
Out[21]:
array([[ 1. , 0.2, 0.2],
[ 0.2, 1. , 0.2],
[ 0.2, 0.2, 1. ]])
pandas有没有更优雅的方法?
我建议改用 numpy 的协方差矩阵方法:http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html
根据我的经验,Pandas 更适合用于数据清理等等。我通常让 numpy 做繁重的统计工作。
看来你可以做到
def makecov(rho, n):
out = numpy.eye(n) + rho
numpy.fill_diagonal(out, 1)
return out
在 R 中,我们可以这样创建相关矩阵:
makecov <- function(rho,n) {
m <- matrix(nrow=n,ncol=n)
m <- ifelse(row(m)==col(m),1,rho)
return(m)
}
正如我们所知的相关性,结果将是:
makecov(0.2,3)
# [,1] [,2] [,3]
#[1,] 1.0 0.2 0.2
#[2,] 0.2 1.0 0.2
#[3,] 0.2 0.2 1.0
但是在pandas中,我们如何有效地创建相同的矩阵呢? 这是我的解决方案:
def makecov(rho,n):
m=[rho/2]*n*n
m=np.array(m).reshape([n,n])
return m+m.T-np.diag([rho]*n)+np.diag([1]*n)
结果将是:
In [21]:makecov(0.2,3)
Out[21]:
array([[ 1. , 0.2, 0.2],
[ 0.2, 1. , 0.2],
[ 0.2, 0.2, 1. ]])
pandas有没有更优雅的方法?
我建议改用 numpy 的协方差矩阵方法:http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html
根据我的经验,Pandas 更适合用于数据清理等等。我通常让 numpy 做繁重的统计工作。
看来你可以做到
def makecov(rho, n):
out = numpy.eye(n) + rho
numpy.fill_diagonal(out, 1)
return out