(사진)
Wi = Wi + η*Xi(t-f(net))
t = true 값
f(net) = 네트워크를 통해 계산된 y값
t-f(net) = 오차
η = 학습율(Learning Rate)
학습률은 w값이 목적값으로 가는 속도를 조절하는 상수역할
- 에타가 크면 빨리 해로 갈 수 O, 정확한 해 구하기는 어렵
- 에타가 작으면 해로 느리게 가지만 정교한 해 구할 수 O
def f(x):
if x > 0:
return 1
else:
return 0
import numpy as np
x = np.array([[1,0,0], [1,0,1], [1,1,0], [1,1,1]])
t = np.array([0,0,0,1]) # AND
#t = np.array([0,1,1,1]) # OR
eta = 0.1
w = np.array([0.5,0.5,0.5])
for iter in range(10):
for i in range(len(x)): # 4가지 경우에 대해 루프
fnet = f(np.dot(x[i], w))
e = t[i] - fnet
w[0] = w[0] + eta * e * x[i][0]
w[1] = w[1] + eta * e * x[i][1]
w[2] = w[2] + eta * e * x[i][2]
print(w)
>> [0.2 0.4 0.4]
[-0.1 0.3 0.3]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
[-0.3 0.2 0.2]
for i in range(4):
print(w[0]+ w[1]*x[i,1] + w[2]*x[i,2])
>>
-0.3
-0.09999999999999995
-0.09999999999999995
0.10000000000000009
(그림)
# xor.ipynb
import numpy as np
def Sigmoid(x):
return 1/(1+np.exp(-x))
x=np.array([[0,0],
[0,1],
[1,0],
[1,1]])
w1=np.array([[-2, 5, 4],
[ 3, 6, 3]])
b1=np.array([ 2, -2, -5])
w2=np.array([[-4],
[ 8],
[-8]])
h=Sigmoid(np.dot(x,w1)+b1) # 4*3 matrix
y=Sigmoid(np.dot(h,w2)) # 4*1 matrix
# np.dot() : 행렬 곱셈 수행 함수
print ("h=",h)
print ("y=",y)
>> h= [[0.88079708 0.11920292 0.00669285]
[0.99330715 0.98201379 0.11920292]
[0.5 0.95257413 0.26894142]
[0.95257413 0.99987661 0.88079708]]
>> y= [[0.06766597]
[0.94927397]
[0.96979454]
[0.0542867 ]]






