프랑크 로젠블라트가 1957년 고안한 알고리즘.
이것이 중요한 이유는 인공신경망에 기원이 되는 알고리즘이기 때문.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력.

과 는 입력신호, 과 는 가중치(weight)
그림의 원을 뉴런 혹은 노드라 부름
입력신호가 뉴런에 보내질 때 각각의 가중치가 곱해짐()
가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소.
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 뉴런이 활성화됨
그 한계를 임계값이라 하며, 기호로 나타낸다.
이를 수식으로 나타내면
위에 식에서 를 로 치환하면 퍼셉트론의 동작이 아래 수식처럼 됩니다.

여기서 b를 편향(bias)이라함
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

AND, OR, NAND는 직선으로 나뉜 두 영역을 만들 수 있습니다.
하지만 XOR 게이트는 직선 하나로는 표현이 불가능합니다.(비선형)
다층 퍼셉트론은 말 그대로 퍼셉트론을 여러 층으로 구성한 것인데 예를 들어.

NAND, OR, AND 게이트를 차례대로 쌓아 다층 퍼셉트론을 만들면 XOR게이트를 구현할 수 있습니다.
이 XOR 게이트에 퍼셉트론은 맨 처음 부분인 1층에서 입력을 받아 2층에 신호를 전달하고 3층에서 이 입력 신호를 바탕으로 Q를 출력합니다.

위 그림을 예시로 들자면 0층에서 입력을 받고 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달하고 y를 출력합니다.
이런식으로 다층 퍼셉트론은 단층 퍼셉트론으로 표현하지 못한 것을 층을 늘려 표현할 수 있게 해줍니다.
이러한 퍼셉트론이 중요한 이유는 신경망을 이루는 기초가 되기 때문에 중요합니다.