【Python・小ネタ】ヴァンデルモンド行列の作り方

プログラミング

今回は小ネタも小ネタですが、案外日本語で紹介している記事が無かったので記事にしました。Pythonでヴァンデルモンド行列を簡単に作る方法をご紹介します。

ヴァンデルモンド行列とは

Vandermonde行列とは以下のような行列のことを言います。

\(
\begin{equation}
\Phi=\begin{bmatrix}
t_1^{n-1}&t_1^{n-2}&\cdots&t_1&1\\
t_2^{n-1}&t_2^{n-2}&\cdots&t_2&1\\
\vdots&\vdots&\ddots&\vdots&1\\
t_m^{n-1}&t_m^{n-2}&\cdots&t_m&1\\
\end{bmatrix}
\end{equation}
\)

理系の方なら一度は見たことがあるんじゃないでしょうか。

ヴァンデルモンド行列ってどこで使うの??

多項式曲線フィッティングを行う際に出てきます。例えば、m人の身長のデータ\({\bf t}=\{t_i\}\)と体重のデータ\({\bf y}=\{y_i\}\)があると思います。ここで、身長から体重を(n-1)次多項式:

\(
y=f(t)=a_{n-1}t^{n-1}+a_{n-2}t^{n-2}+\cdots+a_1t+a_0
\)

で予測したいとします。このとき、\({\bf t}=\{t_i\},{\bf y}=\{y_i\}\)のデータの組から、重み係数\({\bf a}=\{a_i\}\)を求めることを考えます。これを求めるには、m本の以下の連立方程式を解くことになります(もちろん、データ数と係数の個数が重要になってきますが)。

\(
a_{n_1}t_1^{n-1}+a_{n-2}t_1^{n-2}+\cdots+a_0=y_1\\
a_{n_1}t_2^{n-1}+a_{n-2}t_2^{n-2}+\cdots+a_0=y_2\\
\vdots\\
a_{n_1}t_m^{n-1}+a_{n-2}t_m^{n-2}+\cdots+a_0=y_m
\)

これは、

\(
{\bf x}=(a_{n-1},a_{n-2},\cdots,a_0)^T\\
{\bf y}=(y_{1},y_{2},\cdots,y_m)^T
\)

としたとき、先ほどのヴァンデルモンド行列を用いて、\({\bf \Phi x}={\bf y}\)と書くことができます。

Pythonでヴァンデルモンド行列を簡単に使う方法

ほんとに簡単に定義できてしまいます。一見は100聞にしかずということで、下記に作り方を載せます。

array([[ 1, 1, 1, 1, 1], [16, 8, 4, 2, 1], [81, 27, 9, 3, 1]]) 

以上!簡単でしょう?numpyのvanderメソッドを使うことで簡単にヴァンデルモンド行列を生成することができます。

まとめ

今回はPythonの小ネタとしてヴァンデルモンド行列の作り方をご紹介しました!

また、機械学習を勉強するための参考書を以下で紹介しています!よかったら見ていってください。

機械学習を勉強するためのオススメ参考書(理論・Python・Webアプリ)
統計・機械学習に関しては授業で習ったところありますが、結構忘れてしまっています(。また、Rの演習の授業はありましたが、Pythonは学生のころには使っていません。機械学習・データサイエンスを勉強するにあたり、私が参考にしている参考書を一挙ご紹介したいと思います。

コメント