Numpy で行列積を計算する方法〜np.dot関数を使う(動画あり)

AI

機械学習やディープラーニングでは行列積の計算を頻繁に行います。
行列積とは何か。またそれをNumpyで行うにはどうすれば良いかを説明しています。

スポンサーリンク

Numpyで行列計算

行列積について

例えば次のようなAとBの行列を例にします。
$$
A=\begin{pmatrix}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
\end{pmatrix} \\
B=\begin{pmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22} \\
b_{31} & b_{32} \\
\end{pmatrix} \\
$$
AとBの行列積は次のようにします。
$$
AB=\begin{pmatrix}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
\end{pmatrix}
\begin{pmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22} \\
b_{31} & b_{32} \\
\end{pmatrix} \\
$$
具体的に各要素の計算は次のようになります。
$$
AB=\begin{pmatrix}
a_{11} b_{11}+a_{12} b_{21}+a_{13} b_{31} \hspace{20px}
a_{11} b_{12}+a_{12} b_{22}+a_{13} b_{32} \\
a_{21} b_{11} + a_{22} b_{21} +a_{23} b_{31} \hspace{20px}
a_{21} b_{12} + a_{22} b_{22} +a_{23} b_{32}\\
\end{pmatrix}
$$
これをまとめると次のようになります。
$$
AB=\begin{pmatrix}
\displaystyle \sum_{k=1}^3 a_{1k}b_{k1}\hspace{20px} \sum_{k=1}^3 a_{1k}b_{k2}\\
\displaystyle \sum_{k=1}^3 a_{2k}b_{k1}\hspace{20px} \sum_{k=1}^3 a_{2k}b_{k2}
\end{pmatrix}
$$

具体例
$$
AB=\begin{pmatrix}
0 & 1 & 2\\
1 & 2 & 3\\
\end{pmatrix}
\begin{pmatrix}
2 & 1\\
2 & 1\\
2 & 1 \\
\end{pmatrix} \\
$$
$$
=\begin{pmatrix}
0\times2+1\times2+2\times2 \hspace{20px}
0\times1+1\times1+2\times1\\
1\times2 + 2\times2 +3\times2 \hspace{20px}
1\times1 +2\times1 +3\times1\\
\end{pmatrix}
$$
$$
=\begin{pmatrix}
6& 3\\
12 & 6\\
\end{pmatrix}
$$

上記のようなメチャクチャ面倒な計算をNumpyのdot()関数を使うと簡単に計算できます!

行列の積

行列の準備

array1 = np.arange(9).reshape(3,3)
print(array1)
array2 = np.arange(9,18).reshape(3,3)
print(array2)

結果
[[0 1 2]
[3 4 5]
[6 7 8]]

[[ 9 10 11]
[12 13 14]
[15 16 17]]

Numpyのdot関数で行列積を求められます。

np.dot(array1,array2)

結果
array([[ 42, 45, 48],
[150, 162, 174],
[258, 279, 300]])

要素どうしの積

単純に要素どうしの積は次のようにします。

array1 * array2

結果
array([[ 0, 10, 22],
[ 36, 52, 70],
[ 90, 112, 136]])

ゼロ行列作成

ゼロ行列の作成と要素が1だけの配列の作成は次のようになります。

# ゼロ行列の作成
print(np.zeros((2,3),dtype=np.int64))
# 要素が1だけの配列を作成
print(np.ones((2,3),dtype=np.float64))

転置

転置とは行と列を入れ替えることです。
転置を使うことで行列積を行えるようになる場合があります。

$$
A=\begin{pmatrix}
1 & 2 & 3\\
4 & 5 & 6\\
\end{pmatrix}
$$
転置を行うと次のようになります。
$$
A^T=\begin{pmatrix}
1& 4 \\
2 & 5 \\
3 & 6
\end{pmatrix}
$$

転置の例

a = np.array([[1,2,3],[4,5,6]])
print(a)
print(a.T)


転置の例

a = np.array([[0,1,2],[1,2,3]])
b = np.array([[0,1,2],[1,2,3]])
# print(np.dot(a,b))
print(b.T)
print(np.dot(a,b.T))

参考になった書籍

機械学習入門時には、難しいし、リファレンスとしても使いにくいなどであまり活用しなかったが、特徴量エンジニアリングが必要になるくらいから途端にありがたい書籍になった。Pandasの作者自ら書いた本でNumpyやPandasの使い方が詳細に書かれている。

Pythonサンプルのダウンロード

ここでダウンロードする「numpy_lesson.ipynb」ファイルは、このPython動画で使用したものです。

numpy_lesson.ipynb

Numpy動画一覧

タイトルとURLをコピーしました