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になる。