首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy协方差矩阵实现

Numpy协方差矩阵实现
EN

Stack Overflow用户
提问于 2020-12-07 20:37:13
回答 1查看 250关注 0票数 0

对于一个项目,我正在实现CSP算法,其中我需要一个协方差矩阵。在多个文献来源中,我发现了计算协方差矩阵的下列表达式:(X乘以X^{T}) /跟踪(X乘以X^{T}),用于我实现的矩阵X:

代码语言:javascript
复制
covariance = np.matmul(A, np.transpose(A)) / (np.matmul(np.dot(A, np.transpose(A))))

从数学的角度来看,这在我的计算中是有意义的,但这个表达式给出的结果与标准的numpy实现np.cov(A)不一样。我的问题是,我找到的表达式是否实际上是协方差矩阵的有效计算?

https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0125039#pone.0125039.ref006给出了截面材料和方法下的数学。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 21:13:41

你的公式有很多问题。让我一步一步地做

首先定义一个包含两个变量和五个观测值的矩阵A。使用随机数进行演示

代码语言:javascript
复制
np.random.seed(23423)
n_obs = 5
n_var = 2
A = np.random.normal(0.0,1.0, size=(n_var,n_obs))
A

输出

代码语言:javascript
复制
array([[ 1.51978937,  0.56200696, -0.17770035,  0.01628744,  2.45856104],
       [-1.25514739, -0.17201069, -0.42486057, -0.09215201, -0.21674946]])

第二,我们需要对变量进行中心化(减去它们的平均值)。A0将是A的中心版本

代码语言:javascript
复制
A0 = A - A.mean(axis=1).reshape(n_var,-1)
A0

输出

代码语言:javascript
复制
array([[ 0.64400048, -0.31378193, -1.05348924, -0.85950145,  1.58277214],
       [-0.82296337,  0.26017334,  0.00732345,  0.34003201,  0.21543456]])

现在,我们可以使用公式的一个版本计算协方差(只有分子,但除以观测值-1)。

代码语言:javascript
复制
(A0 @ A0.T)/(n_obs-1)

输出

代码语言:javascript
复制
array([[ 1.21673642, -0.14265396],
       [-0.14265396,  0.22676158]])

让我们将其与np.cov进行比较

代码语言:javascript
复制
np.cov(A)

输出

代码语言:javascript
复制
array([[ 1.21673642, -0.14265396],
       [-0.14265396,  0.22676158]])

两场比赛就像承诺的那样。

您的原始公式看起来更像是相关性而不是协方差;但它也存在多个问题(只有一个参数到matmul,需要两个参数,缺少对中的步骤等等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65189002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档