目次
NumPyで行列
前回、回帰分析プログラムの要のコードは次の1行であることを紹介しました。
>>> # 回帰係数の計算
>>> theta = np.linalg.inv(X.T @ X) @ X.T @ y
ここに行列の計算のエッセンスが詰まっています。行列の積、転置行列そして逆行列です。さっそく行列の基本をPythonとともに見ていきましょう。
ベクトルと同じく行列もNumPyライブラリを用いることで定義できます。最初にこれをインポートします。
>>> import numpy as np
行列の定義
さっそく配列を定義するnp.array()関数を使ってみます。
ベクトルの場合には、列ベクトル・行ベクトルの扱いに独特なクセがあることに注意する必要がありますが、行列はクセなく定義できます。
以下グーグル・コラボラトリーの出力結果を使って説明していきます。
このように行列の行ごとを配列[]としてnp.array([])に渡すことで行列が定義されます。コードの書き方は[1行],[2行]とつなげるよりも図のように行ごとに改行して書く方が行列の成分が見やすくできます。
グーグル・コラボラトリーの場合、定義した行列A2をそのまま実行するとarray()の形で出力されます。print文に渡せば行列らしく出力されます。
以下B2、A3、A4と行列を定義しておきます。
行列の和・差
行列の和・差は成分ごとの和・差を計算します。数の計算と同様に「+」「-」記号を用いて計算します。
行列の実数倍
行列の実数倍とは2A2のように行列の前にスカラーを書いて表します。行列Aのすべての成分を2倍する計算です。Pythonでは数の乗算「*」を使います。
行列の積
ここまで行列の和・差・実数倍は分かりやすい計算(演算の定義)です。行列は積の定義が独特です。
次のように行ベクトルと列ベクトルの積が1つの数(スカラー)となる計算が基本です。ここでそれぞれのベクトルの要素数が等しい必要があることに注意します。等しくない場合には積が定義されません(計算できない)。
2次正方行列(2×2行列)と3次正方行列(3×3行列)の場合の積の結果は次の図のようになります。この結果を公式として覚えるよりは、上記の行ベクトル×列ベクトルの計算法則を繰り返し実行することを理解します。
NumPyでは行列の積の計算方法は数種類あります。ここでは「@」を使った方法のみ紹介しておきます。
行列の冪乗
行列の冪乗は「@」を繰り返し用いることで計算できます。A2の2乗、3乗はそれぞれA2 @ A2、A2 @ A2 @ A2と計算できます。
NumPyには行列の冪乗計算のためのnp.linalg.matrix_power()関数が用意されています。第1引数に正方行列(累乗は正方行列だけが可能)そして第2引数に乗数を渡します。
特殊な演算
通常の四則演算で用いられる乗法「*」と冪乗「**」は、NumPyの行列の演算では次のような特殊な演算に用いられます。
以上のグーグル・コラボラトリーのファイル「第23回NumPyで行列.ipynb」は次からダウンロードできます。
https://drive.google.com/file/d/1CxjmAr645hOH70jjZUOJNwpMrQ_UWsOd/view?usp=sharing
このファイルはダブルクリックしても動きません。グーグル・コラボラトリーを起動してこのファイルを開くことでブラウザ上で実行できます。
以上、行列の積までの演算をPythonコードとともに紹介しました。
今回冪乗で使ったnp.linalg.matrix_power()関数のmatrixは行列、powerは冪乗を表すのは文字の通りです。linalgは線形代数linear algebraの略です。
行列の計算はまだまだ続きます。次回はmatrixの和訳「行列」という用語にフォーカスしてみます。