こんにちは!ノイです。 Pythonで行列計算を行う際にNumPyを使うことがよくあります。 for文を使って頑張って書けば同じことはできますが、NumPyは行列計算を高速で行う仕組みがあり、NumPyを使えば頑張らなくても高速で演算ができるので、みんなが使っているのです。
dot関数
NumPyのdot関数は、2つの配列の内積(ドット積)を計算します。 内積は、2つのベクトルの成分ごとの積の総和であり、それぞれの成分を乗算したものを足し合わせた値になります。
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = np.dot(a, b) print(c)
出力は1×4+2×5+3×6 = 4+10+18で32になります。
この例では、2つのベクトルaとbの内積を計算し、その結果を変数cに格納しています。 dot関数は、aとbの要素を対応する位置で乗算して、その結果を足し合わせたものを返しています。
dot関数は、多次元配列でも同様に動作します。配列の内積を計算するために使用されますが、注意点として、a.dot(b)とnp.dot(a, b)は同じ結果を生成することができますが、多次元配列で使用される場合には、np.dotの使用が推奨されます。
機械学習への応用
パーセプトロンでNAND表現
パーセプトロンでNANDを表現するとこのようになります。
import numpy as np def NAND(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) b = 0.6 tmp = np.dot(x, w) + b if tmp <= 0: return 0 else: return 1
このようにニューラルネットワークの基本であるパーセプトロンでNANDを実装することができます。
1層の順伝搬計算
x = np.array([1,2]) print(x.shape) W = np.array([[1,2,3],[4,5,6]]) print(W.shape) np.dot(x, W) #1+8,2+10,3+12
結果
(2,) (2, 3) array([ 9, 12, 15])
ニューラルネットワークの図と対応させるとこのようになります。
余計な一言
ディープラーニングを実装する時はTensorFlowや Pytorchと言ったフレームワークを用いると頑張らなくても簡単に実装ができてしまいます…