【问题标题】:how to use pandas to create correlation matrix of multivariate normal distribution?如何使用熊猫创建多元正态分布的相关矩阵?
【发布时间】:2015-07-09 02:06:40
【问题描述】:

在 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 做到这一点?

【问题讨论】:

  • 你的 r 函数可能只是 `diag&lt;-`(matrix(.2, 3, 3), 1)
  • 我正在阅读 The Art of R Programming。R 函数只是来自这本书。我尝试用 pandas 重写这个 R 函数。但是你的评论很好!

标签: python r matrix pandas statsmodels


【解决方案1】:

看来你可以做到

def makecov(rho, n):
    out = numpy.eye(n) + rho
    numpy.fill_diagonal(out, 1)
    return out

【讨论】:

  • 谢谢!它更快更干净!我的分辨率 10000 个循环,最好的 3:每个循环 19.5 µs,你做的更快 100000 个循环,最好的 3:每个循环 6.82 µs THS
【解决方案2】:

我建议改用 numpy 的协方差矩阵方法:http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html

根据我的经验,Pandas 更适合用于数据清理等。我通常让 numpy 进行繁重的统计工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2015-06-20
    • 2021-04-16
    • 2016-08-26
    • 2021-04-23
    • 2021-04-10
    相关资源
    最近更新 更多