1. Home
  2. プログラマーのための線形代数
  3. 統計学の基本
  4. 分散共分散行列

分散共分散行列

ここでは統計学の基本的ツールである分散共分散行列(または単に共分散行列)について解説します。

当ページで学ぶこと

  • 共分散行列とは
  • Pythonで共分散行列を求める

共分散行列とは

共分散行列は、2 つ以上の確率変数の間の共分散を示す正方行列であり対称行列です。そして共分散行列の対角線の要素は、それぞれの確率変数の分散です。そのため共分散行列は、「分散共分散行列」とも言われます。記号ではギリシャ文字の \(\Sigma\) で表され、以下のように求められます。

\[\begin{eqnarray}
\Sigma =E[(X-E[X]) \times (Y-E[Y])]
\end{eqnarray}\]

なお:\(\Sigma_{i,j} = cov(X_i, X_j)\) であり、\(X\) は、それぞれの列が確率変数を表している行列です。

機械学習において共分散行列は、たとえば変数間の相関関係を失わせるために使われます。そのことから主成分分析において必要不可欠なものとなっています。

Pythonで共分散行列を求める

共分散行列は NumPy の cov() 関数で求めることができます。この関数はデフォルトでは標本の共分散行列を求めます。そして、この関数は 2 次元配列でそれぞれの列が特徴量であるような行列に対して使います。もし、行と列で通常通りに定義された行列に対して使う際は、列の共分散を正しく計算するために行列の転置が必要になります。

例として、以下のコードは 3 つの特徴量を 5 回観察したデータセットで、共分散行列を求めたものです。

In [1]:
import numpy as np
# 観察した行列を定義
X = np.array([
    [1,5,8],
    [3,5,11],
    [2,4,9],
    [3,6,10],
    [1,5,10]])
print(X)
[[ 1  5  8]
 [ 3  5 11]
 [ 2  4  9]
 [ 3  6 10]
 [ 1  5 10]]
In [2]:
Sigma = np.cov(X.T)
print(Sigma)
[[1.   0.25 0.75]
 [0.25 0.5  0.25]
 [0.75 0.25 1.3 ]]