技術っぽいことを書いてみるブログ

PythonとかVue.jsとか技術的なことについて書いていきます。

Pythonでパーセプトロン

パーセプトロンとは

人間の脳の最小単位であるニューロンを真似して作られたアルゴリズムで、
複数の0か1の入力を基に一つの0か1を出力するアルゴリズムです。
図で表すと、以下のようになります。
f:id:where-is-wally:20190416202156p:plain

出力する値を0か1かを決定するために入力された値には、重みづけをして、合計します。
以下の図のように入力値をx・重みをwとすると、計算式は、
 x1×w1+x2×w2+x3×w3
となります。
f:id:where-is-wally:20190416202658p:plain

出力を判定するためには、合計された値がいくら以上であれば1とするかを定義します。
たとえば、合計値が0.4以上であれば、1を出力するとなります。

単純な論理回路の実装

パーセプトロンアルゴリズムをつかって、AND/OR/NAND/XORを表現します。
入力は二つで、出力は一つになります。

AND

import numpy as np

def andGate(x1, x2):
    x = np.array([x1, x2])    
    w = np.array([0.5, 0.5])   #重みづけ
    b = -0.5   #閾値

    tmp = np.sum(x * w) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print("andGateの確認")
print("andGate(0,0)=" + str(andGate(0, 0)))
print("andGate(1,0)=" + str(andGate(1, 0)))
print("andGate(0,1)=" + str(andGate(0, 1)))
print("andGate(1,1)=" + str(andGate(1, 1)))

実行結果

andGateの確認
andGate(0,0)=0
andGate(1,0)=0
andGate(0,1)=0
andGate(1,1)=1

OR

import numpy as np

def orGate(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])  #重みづけ
    b = -0.4   #閾値

    tmp = np.sum(x * w) + b
    if tmp <= 0:
        return 0
    else:
        return 1

実行結果

orGateの確認
orGate(0,0)=0
orGate(1,0)=1
orGate(0,1)=1
orGate(1,1)=1

NAND(Not AND)

import numpy as np

def nandGate(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])  #重みづけ
    b = 0.7   #閾値

    tmp = np.sum(x * w) + b
    if tmp <= 0:
        return 0
    else:
        return 1

実行結果

nandGateの確認
nandGate(0,0)=1
nandGate(1,0)=1
nandGate(0,1)=1
nandGate(1,1)=0

AND/OR/NANDのポイント

AND/OR/NANDは、重みの値と閾値を変更するだけで、実現できます。

XOR

XOR(排他的論理和)は、AND/OR/NANDを組み合わせることで実現させます。

~省略~
def xorGate(x1, x2):
    s1 = nandGate(x1, x2)
    s2 = orGate(x1, x2)
    return andGate(s1, s2)

print("xorGateの確認")
print("xorGate(0,0)=" + str(xorGate(0, 0)))
print("xorGate(1,0)=" + str(xorGate(1, 0)))
print("xorGate(0,1)=" + str(xorGate(0, 1)))
print("xorGate(1,1)=" + str(xorGate(1, 1)))

実行結果

xorGateの確認
xorGate(0,0)=0
xorGate(1,0)=1
xorGate(0,1)=1
xorGate(1,1)=0

パーセプトロンを確認する理由

パーセプトロンを多層化することで、より複雑な情報を処理できるようになります。
そして、パーセプトロンを参考にして、機械学習ニューラルネットワークが誕生し、
そして、ニューラルネットワークを何重にも多層化したものがディープラーニングなります。

最後に・・・

ようやく機械学習っぽい勉強になってきました。