PythonのNumpyライブラリを利用すると、機械学習で大量のデータを扱う際に必要な、行列の計算を簡単に行うことができる。
今回は、行列の加算/減算/乗算といった行列の計算や、逆行列や転置行列の算出を行ってみたので、そのサンプルプログラムを共有する。
やってみたこと
行列同士の加算/減算
行列同士の加算/減算は、行と列の数が同じ行列の場合のみ、対応する成分同士を加算/減算することで計算できる。実際に計算した結果は、以下の通り。
\[
\begin{eqnarray}
\begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix} &+&
\begin{pmatrix} 1 & 3 \\ 2 & 1 \end{pmatrix} &=&
\begin{pmatrix} 1+1 & 2+3 \\ 4+2 & 5+1 \end{pmatrix} &=&
\begin{pmatrix} 2 & 5 \\ 6 & 6 \end{pmatrix} \\
\begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix} &-&
\begin{pmatrix} 1 & 3 \\ 2 & 1 \end{pmatrix} &=&
\begin{pmatrix} 1-1 & 2-3 \\ 4-2 & 5-1 \end{pmatrix} &=&
\begin{pmatrix} 0 & -1 \\ 2 & 4 \end{pmatrix}
\end{eqnarray}
\]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import numpy as np A = np.array([ [1,2], [4,5] ]) B = np.array([ [1,3], [2,1] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print() print("*** 行列同士の加算 ***") print("*** A + B ***") C = A + B print(C) print("*** 行列同士の減算 ***") print("*** A - B ***") D = A - B print(D) |
\[
\begin{eqnarray}
\begin{pmatrix} 6 & 5 & 4 \\ 4 & 5 & 6 \end{pmatrix} &+&
\begin{pmatrix} 1 & 2 & 3 \\ 3 & 2 & 1 \end{pmatrix} &=&
\begin{pmatrix} 6+1 & 5+2 & 4+3 \\ 4+3 & 5+2 & 6+1 \end{pmatrix} &=&
\begin{pmatrix} 7 & 7 & 7 \\ 7 & 7 & 7 \end{pmatrix} \\
\begin{pmatrix} 6 & 5 & 4 \\ 4 & 5 & 6 \end{pmatrix} &-&
\begin{pmatrix} 1 & 2 & 3 \\ 3 & 2 & 1 \end{pmatrix} &=&
\begin{pmatrix} 6-1 & 5-2 & 4-3 \\ 4-3 & 5-2 & 6-1 \end{pmatrix} &=&
\begin{pmatrix} 5 & 3 & 1 \\ 1 & 3 & 5 \end{pmatrix}
\end{eqnarray}
\]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import numpy as np A = np.array([ [6,5,4], [4,5,6] ]) B = np.array([ [1,2,3], [3,2,1] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print() print("*** 行列同士の加算 ***") print("*** A + B ***") C = A + B print(C) print("*** 行列同士の減算 ***") print("*** A - B ***") D = A - B print(D) |
行列の定数倍
行列の定数倍は、行列のそれぞれの成分に、指定された定数を掛けることで計算できる。実際に計算した結果は、以下の通り。
\[
\begin{eqnarray}
3\begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix} &=&
\begin{pmatrix} 3 \times 1 & 3 \times 2 \\ 3 \times 4 & 3 \times 5 \end{pmatrix} =
\begin{pmatrix} 3 & 6 \\ 12 & 15 \end{pmatrix} \\
-2\begin{pmatrix} 6 & 5 & 4 \\ 4 & 5 & 6 \end{pmatrix} &=&
\begin{pmatrix} -2 \times 6 & -2 \times 5 & -2 \times 4 \\ -2 \times 4 & -2 \times 5 & -2 \times 6 \end{pmatrix} =
\begin{pmatrix} -12 & -10 & -8 \\ -8 & -10 & -12 \end{pmatrix}
\end{eqnarray}
\]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import numpy as np A = np.array([ [1,2], [4,5] ]) B = np.array([ [6,5,4], [4,5,6] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print() print("*** 行列の定数倍 ***") print("*** 3A ***") C = 3 * A print(C) print("*** -2B ***") D = -2 * B print(D) |
行列同士の乗算
行列同士の乗算は、左の行列をA、右の行列をBとした場合、行列Aの列数と行列Bの行数が一致している場合のみ、計算できる。
行列同士の乗算の公式は、以下のサイトを参照のこと。
https://lab-brains.as-1.co.jp/enjoy-learn/2023/07/50258/
実際に計算した結果は、以下の通り。
\[
\begin{eqnarray}
\begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix}
\begin{pmatrix} 1 & 3 \\ 2 & 1 \end{pmatrix} &=&
\begin{pmatrix} 1 \times 1 + 2 \times 2 & 1 \times 3 + 2 \times 1 \\ 4 \times 1 + 5 \times 2 & 4 \times 3 + 5 \times 1 \end{pmatrix} =
\begin{pmatrix} 1 + 4 & 3 + 2 \\ 4 + 10 & 12 + 5 \end{pmatrix} =
\begin{pmatrix} 5 & 5 \\ 14 & 17 \end{pmatrix} \\
\begin{pmatrix} 1 & 3 \\ 2 & 1 \end{pmatrix}
\begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix} &=&
\begin{pmatrix} 1 \times 1 + 3 \times 4 & 1 \times 2 + 3 \times 5 \\ 2 \times 1 + 1 \times 4 & 2 \times 2 + 1 \times 5 \end{pmatrix} =
\begin{pmatrix} 1 + 12 & 2 + 15 \\ 2 + 4 & 4 + 5 \end{pmatrix} =
\begin{pmatrix} 13 & 17 \\ 6 & 9 \end{pmatrix} \\
\begin{pmatrix} 1 & 2 & 3 \\ 3 & 2 & 1 \end{pmatrix}
\begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 1 & 2 \end{pmatrix} &=&
\begin{pmatrix} 1 \times 1 + 2 \times 3 + 3 \times 1 & 1 \times 2 + 2 \times 4 + 3 \times 2 \\ 3 \times 1 + 2 \times 3 + 1 \times 1 & 3 \times 2 + 2 \times 4 + 1 \times 2 \end{pmatrix} =
\begin{pmatrix} 1 + 6 + 3 & 2 + 8 + 6 \\ 3 + 6 + 1 & 6 + 8 + 2 \end{pmatrix} =
\begin{pmatrix} 10 & 16 \\ 10 & 16 \end{pmatrix}
\end{eqnarray}
\]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import numpy as np A = np.array([ [1,2], [4,5] ]) B = np.array([ [1,3], [2,1] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print() print("*** 行列同士の乗算 ***") print("*** AB ***") C = np.dot(A, B) print(C) print("*** BA ***") D = np.dot(B, A) print(D) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import numpy as np A = np.array([ [1,2,3], [3,2,1] ]) B = np.array([ [1,2], [3,4], [1,2] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print() print("*** 行列同士の乗算 ***") print("*** AB ***") C = np.dot(A, B) print(C) |
逆行列
正方行列\(A\)に対して、\(AA^{-1}=A^{-1}A=I\)が成立するような正方行列\(A^{-1}\)が存在するとき、\(A^{-1}\)を\(A\)の逆行列という。ただし、\(I\)は\(A\)と同じサイズの単位行列とする。
逆行列の詳細と公式は、以下のサイトを参照のこと。
https://manabitimes.jp/math/1153
例えば、\(A=\begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}\)の場合、逆行列を計算した結果は、以下の通り。
\[
\begin{eqnarray}
A^{-1}=\frac{1}{1 \times 4 – 2 \times 3}\begin{pmatrix} 4 & -2 \\ -3 & 1 \end{pmatrix}=-\frac{1}{2}\begin{pmatrix} 4 & -2 \\ -3 & 1 \end{pmatrix}
=\begin{pmatrix} -2 & 1 \\ 1.5 & -0.5 \end{pmatrix}
\end{eqnarray}
\]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import numpy as np A = np.array([ [1,2], [3,4] ]) print("*** 行列A ***") print(A) print("*** 行列Aの逆行列 ***") B = np.linalg.inv(A) print(B) print() print("*** 行列Aとその逆行列の乗算 ***") C = np.dot(A, B) print(C) # print(data)を表示する際、小数点以下3桁まで+指数表記しない形式に設定 np.set_printoptions(precision=3, suppress=True) print("*** 行列Aとその逆行列の乗算(形式変更後) ***") print(C) |
転置行列
\(m \times n\)行列である\(A=\left(
\begin{array}{cccc}
a_{11} & a_{12} & \ldots & a_{1n} \\
a_{21} & a_{22} & \ldots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1} & a_{m2} & \ldots & a_{mn}
\end{array}
\right)\)に対し、その行と列を入れ替えた
\(n \times m\)行列である\({}^t \! A=\left(
\begin{array}{cccc}
a_{11} & a_{21} & \ldots & a_{m1} \\
a_{12} & a_{22} & \ldots & a_{m2} \\
\vdots & \vdots & \ddots & \vdots \\
a_{1n} & a_{2n} & \ldots & a_{mn}
\end{array}
\right)\)を\(A\)の転置行列という。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import numpy as np A = np.array([ [1,2], [4,5] ]) B = np.array([ [1,2,3], [3,2,1] ]) C = np.array([ [1], [2], [3] ]) print("*** 行列A ***") print(A) print("*** 行列B ***") print(B) print("*** 行列C ***") print(C) print() print("*** 転置行列 ***") print("*** Aの転置行列 ***") At = A.T print(At) print("*** Bの転置行列 ***") Bt = B.T print(Bt) print("*** Cの転置行列 ***") Ct = C.T print(Ct) |
要点まとめ
- PythonのNumpyライブラリを利用すると、行列の加算/減算/乗算といった行列の計算や、逆行列や転置行列の算出を簡単に行うことができる。