
2つの物理量の間の相関を分析することは工学的問題として重要です。ここでは基本的なベクトルと関数の相関の考え方を紹介し、Pythonを使って実際に計算することで理解を深めます。
こんにちは。wat(@watlablog)です。ここではいろんな所で役立つ「相関」について整理し、Pythonで検証していきます!
本記事の主旨
本記事ではベクトル(Vector)、関数(Function)の相関について式の導出と考え方をまとめていきます。
2つのデータが似ているとはどういうことだろう?
よく回帰曲線を引いて相関係数を出しているけど、関数の場合は一般的にどう考えるんだろう?
…と、ふと思ったことがきっかけです。
内容は初等数学的なことばかりですが、おそらく普段はExcel等で自動で計算している人が多いと思い、図を書きながらまとめていきます。
また、今回はPythonでプログラミングを行い、実際に相関係数を計算をしてみます。自分でプログラムを書いて動かしてみることで理解が深まると思いますので、是非写経してみて下さい。
ベクトルの相関
問題
関数の相関を説明する前に、まずは基本であるベクトル(Vector)の相関について考えていきます。
以下はベクトル
この2つのベクトルはどれくらい似ているでしょうか?というのが最初の問題です。

…ぱっと見で良いのであれば、「どちらのベクトルも第1象限にあり、大きさもなんとなく近い」ということでしょうが、それで良いのであればこのページを見てはいないと思います。
相関を論じる時はExcel等でお馴染みの相関係数
相関係数は、
…と、-1から1の範囲で値をとり、1に近いほど正の相関が、-1に近いほど負の相関が、そして0であれば無相関といった評価が可能です。
今回の問題も「相関係数がいくつ」と言えるようにしていきましょう。
で考える
まずは自明な例で見ていきます。
下図ベクトル
一方、ベクトル
さらに、ベクトル

これらの関係性とぴったり一致するのが
ベクトルの相関係数を計算する式
検討を進める糸口がつかめたので、ベクトルの相関係数を計算する式を考えてみます。そのために、先ほどの問題図に色々書き込んでみました。

図中
ノルムにも色々種類がありますが、今回のノルムはベクトルの各項を二乗してルートをとっているのでL2ノルムと呼ばれるものです(機械学習でも出てきましたね)。
ノルムを三角形の斜辺と捉えれば、それぞれのベクトルに関係する三角関数は式(2)のように書けます。
2つのベクトルの
式(3)に式(2)を代入すると、式(4)が導出されます。
この
※厳密には平均値を引いた変動成分が相関係数で、それをしないのはパターン類似率と呼ぶそうです。
完全な無相関の場合は2つのベクトルが直交するので、
Pythonで2つのベクトルの相関を求めるコード
コードを書かないと当ブログのアイデンティティが無くなるので…せっかくなのでPythonコードを書いてみます。
式(5)の部分を関数にしただけなので簡単です。式自体はnp.linalg.normを使って簡略化しています。
上記コードを実行するとコンソールに「0.0」が表示されます。直交の例ですね。
ちなみに、matplotlibの.quiver()で描画すると下図のようになります。

関数の相関
問題
続いて、関数(Function)の相関を考えていきます。関数といっても、先ほどのベクトルの場合と全く同じ考え方をします。
関数は本来連続的ですが、ベクトルの考え方を使うためにまずは離散関数、かつイメージしやすい時間関数を考えます。
下図は関数

似てる?似てない??
離散化して同一時刻
関数の大きさを考える
冒頭の2つのベクトルに関する問題は始点を揃えていたので、ベクトルの大きさは要素の二乗和に対して平方根をとれば良いのですが、関数の場合は同じ関数でも離散数
そのため式(6)とルート内を
関数が本来連続であることを考慮すると、式(6)の
内積を考える
関数の大きさを表すことができたため、次は関数の内積を考えます。
式(7)と同様に
関数の相関係数を計算する式
関数の大きさと内積を式で表現することができたので、先のベクトルの場合と同様に、関数の相関係数は式(10)と書くことができます。
関数が離散である場合は、式(6)と式(8)を用いて式(11)と書くことができます(
関数が連続である場合は式(7)と式(9)を使って、式(12)と書くことができます。
Pythonで2つの関数の相関を求めるコード
離散関数の場合の相関について、Pythonコードでも確認していきます。
…といっても、同一時刻でサンプリングした離散関数は先ほどのベクトルの場合と全く同じコードでいけてしまいます(
以下のコードは先に紹介したもののnp.linalg.normや転置をそのまま使い、データ作成部分のみを変更しただけになります。
関数fはサイン関数、関数gはノイズで、r_auto(fとfの自己相関)、r_cross(fとgの相互相関)の2つの相関係数を計算してみます。
r_auto=1.0, r_cross≒0.0という想定通りの結果が得られました。
ちなみに、matplotlibでグラフ化すると下図になります。

連続関数の相関は、おそらく数式をそのまま扱うsympyとか使うと普通に出来そうですが…需要は無さそう?
sympyについては「Python/sympyでテイラー展開した結果をグラフ化する方法」に概要を書いていますので、ご興味がありましたら是非読んでみて下さい。
まとめ
本記事では普段何気なく「相関」を使っている人向けに基本的なベクトルと関数の相関の考え方をまとめてみました。
多分学生の時どこかでやったかも知れないけど、いざ考え直すと忘れているものです。
工学的には理論値と実験値がどれだけ相関があるか、といった問題をよく扱います。その時に、Excelの機能にばかり頼ってしまってはカッコ悪いもの。Pythonの学習もかねて是非自分のものにしてみましょう。
※注意点
実データは様々なノイズにさらされています。相関が高いからといって安心はできないのでご注意下さい。しっかりとした分析にはきっと統計的な処理、検定等を使いこなす事が必要と思います(後でやる!)。
今回は基礎でした!申し訳程度のPythonコードでしたが、重要な事なのでマスターしましょう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント