shikoan’s memo

プログラミング初心者のチラ裏

ぷろぐらみんぐ帳

Numpyで相関行列

テスト用のデータを作成。

import numpy as np

# テストデータ
x = np.arange(5).reshape(5,1)
print(x)
print()
[[0]
 [1]
 [2]
 [3]
 [4]]

このまま複製して相関係数を計算すると「標準偏差が0だゴルァ」と怒られるので、ノイズを乗っける。平均0、標準偏差0.5の正規乱数を各20個、合計100個用意する(再現性を出すために乱数シードを設定)。

# 乱数のシード設定
np.random.seed(123)
# ノイズを乗っける
noise = np.random.normal(loc=0.0, scale=0.5, size=100).reshape(5, 20)
data = x + noise
print(data)
print()
[[-0.5428153   0.49867272  0.14148925 -0.75314736 -0.28930013  0.82571827
  -1.21333962 -0.21445631  0.63296813 -0.4333702  -0.33944308 -0.04735448
   0.74569481 -0.319451   -0.22199098 -0.21717564  1.10296504  1.09339304
   0.50202695  0.1930932 ]
 [ 1.36868429  1.74536601  0.53208307  1.58791452  0.37305967  0.68112425
   1.4535526   0.28565965  0.92996564  0.56912255  0.87219031 -0.39929455
   0.11423345  0.65006138  1.46373122  0.91318216  1.00142296  1.34411136
   0.56023183  1.14181366]
 [ 1.59731674  1.13616525  1.8045501   2.28690293  2.16929453  1.99408475
   3.19618263  2.20645608  2.489368    3.11907167  1.35295734  1.48060589
   2.87185611  1.60096863  2.01484162  2.53465798  2.4453532   2.87744309
   2.74782207  2.53469633]
 [ 2.61364564  3.39743133  3.157136    2.33686727  3.70864952  3.40361827
   3.02274504  2.88345397  2.40084943  3.09976204  3.23421956  2.58442251
   3.58110202  2.45139848  1.93844982  3.51986355  2.79831698  2.93698521
   2.58124164  2.19701862]
 [ 4.62761869  3.65556551  4.83047624  4.40365409  3.84262093  3.4570488
   3.63376901  3.39373843  5.04355668  4.08222062  4.57510277  3.36632398
   4.09051756  4.58893097  3.83249462  4.51555723  3.45771604  3.31826423
   4.18970031  3.81041178]]

相関行列は以下の通り

# 相関行列
C = np.corrcoef(data)
print(C)
[[ 1.         -0.1302316   0.05565825  0.12951066 -0.24792661]
 [-0.1302316   1.          0.0090564  -0.26099422  0.07399095]
 [ 0.05565825  0.0090564   1.          0.03105442 -0.14340739]
 [ 0.12951066 -0.26099422  0.03105442  1.         -0.10365978]
 [-0.24792661  0.07399095 -0.14340739 -0.10365978  1.        ]]

相関行列の[0,0]はdata[0]とdata[0]の相関係数で、相関行列の[0,1]はdata[0]とdata[1]の相関係数……と続く。data[i]とdata[i]の相関係数は1なので(全く同じデータだから)、相関行列の対角要素は必ず1になる。