🐍

numpy.cov(X.T) 分散共分散行列について

2024/07/31に公開
1

背景

dataframeをndarrayへと変換した後、分散教分散行列を求める方法が調べても見つからなかったため、以下に方法を示す。
(見つからなかっただけで、絶対にどこかの記事に書いてあると思う...)

分散共分散行列

import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,6,5,4,3,2,1])

上記のデータxおよびyの分散共分散行列はどのように求めることができるだろうか。

np.cov(x,y)

スクリーンショット 2024-07-31 20.37.47.png

上記の通り書くことで分散共分散行列を求めることができる。
では、一方で以下のようなデータの場合どうだろうか。

X = np.vstack((x,y)).T
X

スクリーンショット 2024-07-31 20.40.12.png

xとyをそれぞれ列に持ち、各行に値が格納されている場合だ。
(単純にDataFrameと同じ構造だと思って欲しい)

先ほどと同様に以下の通りプログラムを動かしてみる。

np.cov(X)

この場合9x9の行列が返ってくる。
/*以下追記
これはcov関数の引数「rowvar」がデフォルトでTrueであり、
この場合行を変数として認識してしまう。
そのため、9個の変数を持つと認識し、9x9の行列が作成されてしまう。
以下のように記載することで、正しく分散共分散行列を求めることもできる。

np.cov(X, rowvar=False)

*/
これはXが9x2の行列のため、9x9の行列が返ってきてしまっている。
では、以下のように書いてみたらどうだろうか。

np.cov(X.T)

スクリーンショット 2024-07-31 20.55.36.png

問題なく求めることができたようだ。

まとめ

dataframeと同様の構造を持つndarrayより分散共分散行列を算出する場合は、
np.cov(X.T)のように、転置した行列をcov関数の引数に格納するようにすれば良い。

Discussion

nkaynkay

ちなみにnp.cov(X, rowvar=False)でも可能です。