表計算による内積と、関数によるコベクトルの考え方を復習して、その観点からパーセプトロンによる論理演算を見ます。NumPyによる計算を添えます。

シリーズの記事です。

  1. 見積りで考える内積
  2. 関数で考えるコベクトル
  3. 関数で考える行列
  4. 関数で考える双対性
  5. コベクトルで考えるパーセプトロン ← この記事

この記事は以下の書籍の補助となることを意図して書きました。

見積り計算

以前の例を再掲します。

品名 単価(A社) 個数 小計
鉛筆 30 12 360
消しゴム 50 10 500
ノート 150 5 750
総計 1,610

単価と数量をベクトルで書き直せば、これは内積の計算です。

\overbrace{\left(\begin{matrix}30 \\ 50 \\150\end{matrix}\right)}^{単価}\cdot
\overbrace{\left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)}^{個数}
=\overbrace{30×12}^{小計}+\overbrace{50×10}^{小計}+\overbrace{150×5}^{小計}
=\overbrace{1610}^{総計}

NumPy

NumPyでの計算を示します。

>>> from numpy import *
>>> dot([30,50,150],[12,10,5])
1610

※ 以後 import は省略します。

一気に総計を求めないで、アダマール積により小計を求めます。

>>> array([30,50,150])*[12,10,5]
array([360, 500, 750])

小計の合計により総計が得られます。

>>> sum(array([30,50,150])*[12,10,5])
1610

コベクトルによる関数化

A社の単価を A という横ベクトル(コベクトル)に割り当てれば、内積を取ることが関数を評価することと同一視できます。

>>> A=[30,50,150]
>>> dot(A,[12,10,5])
1610
A
 \left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)
=\left(\begin{matrix}30 &  50 &  150\end{matrix}\right)
 \left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)
=1610

個数の比較

個数を変えて比較するケースを考えます。

品名 単価 個数① 個数② 小計① 小計②
鉛筆 30 12 9 360 270
消しゴム 50 10 13 500 650
ノート 150 5 4 750 600
総計 1,610 1,520

コベクトルを使った計算では、引数のベクトルを横に並べた行列を渡せば、一度に計算できます。

>>> dot(A,array([[12,10,5],[9,13,4]]).T)
array([1610, 1520])
\begin{align}
A\left(\begin{array}{c|c}12 & 9 \\ 10 & 13 \\ 5 & 4\end{array}\right)
&=\left(\begin{matrix}
    A\left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right) &
    A\left(\begin{matrix} 9 \\ 13 \\ 4\end{matrix}\right)
  \end{matrix}\right) \\
&=\left(\begin{matrix}1610 & 1520\end{matrix}\right)
\end{align}

ここまでが復習です。

AND

論理演算として AND を考えます。乗積表を示します。

A B A&B
0 0 0
0 1 0
1 0 0
1 1 1

これはコベクトルでは表せない類の計算です。そのため後処理を加えます。

考え方としては、AとBを足して、それが1より大きいかを調べ、真なら1とします。

A B A+B >1 A&B
0 0 0 F 0
0 1 1 F 0
1 0 1 F 0
1 1 2 T 1

AとBを足す部分をコベクトル And0 で表し、大小比較を加え、数値化するためゼロを足します。

>>> And0=[1,1]
>>> (dot(And0,array([[0,0],[0,1],[1,0],[1,1]]).T)>1)+0
array([0, 0, 0, 1])

このコベクトル $(1\ 1)$ を重み $w$、>1 の $1$ を閾値 $θ$ と呼びます。

※ θはthに相当する文字です。英語で閾値を意味するthresholdの頭文字を表しています。

パーセプトロン

重みと閾値による計算をパーセプトロンと呼びます。パーセプトロンの関数を定義します。

>>> def perceptron(w, th, x):
...     return (dot(w, x) > th) + 0
...

これを使って AND を計算します。

>>> perceptron(And0, 1, [0,1])
0

コベクトルと同じように、引数を複数受け付けます。

>>> perceptron(And0, 1, array([[0,0],[0,1],[1,0],[1,1]]).T)
array([0, 0, 0, 1])