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}
\]
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}
\]
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}
\]
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}
\]
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)
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}
\]
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\)の転置行列という。
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ライブラリを利用すると、行列の加算/減算/乗算といった行列の計算や、逆行列や転置行列の算出を簡単に行うことができる。





