将协方差矩阵转换为相关矩阵是数据分析中常用的一个操作。下面是用Python实现此操作的完整攻略。
什么是协方差矩阵和相关矩阵
先来简单介绍一下协方差矩阵和相关矩阵的概念。
协方差矩阵是一个对称的矩阵,用于衡量两个随机变量之间的相关性。如果两个随机变量的协方差值为正数,则认为它们是正相关的;反之,则认为它们是负相关的。如果协方差近似于0,则认为两个随机变量是不相关的。
相关矩阵是一个对称的矩阵,用于衡量不同随机变量之间的相关性。它与协方差矩阵非常相似,不同的是它是将协方差矩阵中每一个元素除以标准偏差的乘积,从而数据变得标准化,使得比较不同变量之间的相关性更为准确。
如何将协方差矩阵转换成相关矩阵
下面介绍一下如何将协方差矩阵转换为相关矩阵。
如果有一个 $n$ 维向量 $X$,其协方差矩阵为 $C$,则其相关矩阵为 $R$,由下式给出:
$$r_{ij} = \frac{c_{ij}}{\sqrt{c_{ii}c_{jj}}}$$
其中,$c_{ij}$ 是协方差矩阵 $C$ 中第 $i$ 行,第 $j$ 列位置的元素,$c_{ii}$ 和 $c_{jj}$ 分别是 $C$ 中第 $i$ 行,第 $j$ 列位置的元素。
下面通过两个示例来展示如何用Python实现协方差矩阵到相关矩阵的转换。
示例1
假设有一个3维向量的数据,存储在一个 $3 \times 3$ 的矩阵 $X$ 中,用以下代码生成:
import numpy as np
X = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
首先计算协方差矩阵:
C = np.cov(X, rowvar=False)
计算出的协方差矩阵为:
array([[6., 6., 6.],
[6., 6., 6.],
[6., 6., 6.]])
接下来按照上面的公式计算出相关矩阵:
stds = np.sqrt(np.diag(C))
R = C / np.outer(stds, stds)
得到的相关矩阵为:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
可以看到,这个相关矩阵是一个单位矩阵,证明数据三列之间没有相关性。
示例2
假设有一个4维向量的数据,存储在一个 $4 \times 4$ 的矩阵 $X$ 中,用以下代码生成:
X = np.array([
[1, 1, 3, 9],
[2, 4, 6, 8],
[7, 5, 4, 1],
[3, 9, 5, 2]
])
首先计算协方差矩阵:
C = np.cov(X, rowvar=False)
计算出的协方差矩阵为:
array([[10.91666667, -1.25 , -3.5 , 3.08333333],
[-1.25 , 5.5 , 6. , -5.25 ],
[-3.5 , 6. , 5.91666667, -3.08333333],
[ 3.08333333, -5.25 , -3.08333333, 10.91666667]])
接下来按照上面的公式计算出相关矩阵:
stds = np.sqrt(np.diag(C))
R = C / np.outer(stds, stds)
得到的相关矩阵为:
array([[ 1. , -0.20178521, -0.59201431, 0.28280366],
[-0.20178521, 1. , 0.87486311, -0.8674139 ],
[-0.59201431, 0.87486311, 1. , -0.59466125],
[ 0.28280366, -0.8674139 , -0.59466125, 1. ]])
可以看到,四列之间存在一定程度的相关性,如第1、2列相关性较小,第2、3列相关性较大,第1、4列呈现负相关性。
总结
完成协方差矩阵和相关矩阵的转换,只需要进行简单的数学变换即可。上面的示例给出了完整的Python代码,可以直接拿来使用,也可以自己编写类似的代码实现此操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Python将协方差矩阵转换为相关矩阵 - Python技术站