Help us understand the problem. What is going on with this article?

コベクトルで考えるパーセプトロン

More than 3 years have passed since last update.

表計算による内積と、関数によるコベクトルの考え方を復習して、その観点からパーセプトロンによる論理演算を見ます。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])
7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away