딥러닝/정형데이터

퍼셉트론 구현

씩씩한 IT블로그 2020. 7. 6. 16:42
반응형

1. 외출여부 판단 퍼셉트론 함수

# 1. 신호의 총합과 외출 여부를 반환하는 Perceptron 함수를 완성하세요.
def Perceptron(x_1,x_2,w_1,w_2):
    
    # bias는 외출을 좋아하는 정도로 -1로 설정되어 있습니다.
    bias = -1
    
    # 입력 받은 값과 편향(bias)값을 이용하여 신호의 총합을 구하세요.
    output = w_1*x_1+w_2*x_2+bias
    
    # 지시한 Activation 함수를 참고하여 외출 여부(0 or 1)를 설정하세요.
    # 외출 안한다 : 0 / 외출 한다 : 1 
    if output>0:
        y = 1
    else:
        y=0
    
    return output, y
    
# 값을 입력 받는 함수입니다. 
def input_func():
    
    # 비 오는 여부(비가 온다 : 1 / 비가 오지 않는다 : 0)
    x_1 =  int(input("x_1 : 비가 오는 여부(1 or 0)을 입력하세요."))
        
    # 여자친구가 만나자고 하는 여부(만나자고 한다 : 1 / 만나자고 하지 않는다 : 0)
    x_2 =  int(input("x_2 : 여친이 만나자고 하는 여부(1 or 0)을 입력하세요."))
        
    # 비를 좋아하는 정도의 값(비를 싫어한다 -5 ~ 5 비를 좋아한다)
    w_1 =  int(input("w_1 : 비를 좋아하는 정도 값을 입력하세요."))
        
    # 여자친구를 좋아하는 정도의 값(여자친구를 싫어한다 -5 ~ 5 비를 좋아한다)
    w_2 =  int(input("w_2 : 여친을 좋아하는 정도 값을 입력하세요."))
        
    return x_1,x_2,w_1,w_2
    
def main():
    
    x_1,x_2,w_1,w_2 = input_func()
    
    y, go_out = Perceptron(x_1,x_2,w_1,w_2)
    
    print("\n신호의 총합 : %d" %y)
    print("외출 여부 : %d\n" %go_out)
    
if __name__ == "__main__":
    main()

 

2. AND OR gate

# [AND OR gate]
import numpy as np

# 1. AND gate 함수를 구현하세요.
def AND_gate(x1, x2):
    x = np.array([x1, x2])
    
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([1,1])
    
    # 1-1. AND gate를 만족하는 bias를 설정합니다.
    bias = -1.5
    
    # 1-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x*weight)+bias
    
    # Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)

# 2. OR gate 함수를 구현하세요.
def OR_gate(x1, x2):
    x = np.array([x1, x2])
    
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([1,1])
    
    # 2-1. OR gate를 만족하는 bias를 설정합니다.
    bias = -0.5
    
    # 2-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x*weight)+bias
    
    #Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)

# 3. Step Function 구현
def Step_Function(y):
    if y>0:
        return 1
    else:
        return 0   
    
def main():
    
    # AND Gate와 OR Gate에 넣어줄 Input 입니다.
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # AND Gate를 만족하는지 출력하여 확인합니다.
    print('AND Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',AND_gate(x1, x2))
        
    # OR Gate를 만족하는지 출력하여 확인합니다.
    print('\nOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',OR_gate(x1, x2))

if __name__ == "__main__":
    main()

 

3. NAND NOR gate

# [NAND NOR gate]

import numpy as np


# 1. NAND_gate 함수를 구현하세요.
def NAND_gate(x1, x2):
    x = np.array([x1,x2])
    weight = np.array([-1,-1])
    bias = 1.5
    y = np.sum( x * weight)+bias
    
    return Step_Function(y)
    
# 2. NOR gate 함수를 구현하세요.
def NOR_gate(x1, x2):
    x = np.array([x1,x2])
    weight = np.array([-1,-1])
    bias = 0.5
    y = np.sum( x * weight)+bias
    
    return Step_Function(y) 
    
# 3. Step Function 함수를 구현하세요.
# 앞 실습에서 구현한 함수를 그대로 사용할 수 있습니다.
def Step_Function(y):
    if y>=0:
        return 1
    else:
        return 0
    
    
def main():
    
    # NAND, NOR Gate에 넣어줄 Input
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # NAND, NOR Gate를 만족하는지 출력하여 확인
    print('NAND Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NAND_gate(x1, x2))
        
    print('NOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NOR_gate(x1, x2))
        

        
if __name__ == "__main__":
    main()

 

4. XOR gate

#[XOR gate]

import numpy as np


# 1. `AND_gate` 함수를 구현하세요. 
def AND_gate(x1, x2):
    x = np.array([x1, x2])
    
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([1,1])
    
    # 1-1. AND gate를 만족하는 bias를 설정합니다.
    bias = -1.5
    
    # 1-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x*weight)+bias
    
    # Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)

# 2. OR gate 함수를 구현하세요.
def OR_gate(x1, x2):
    x = np.array([x1, x2])
    
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([1,1])
    
    # 2-1. OR gate를 만족하는 bias를 설정합니다.
    bias = -0.5
    
    # 2-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x*weight)+bias
    
    #Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)
    
    
# 3. `NAND_gate` 함수를 구현하세요.
def NAND_gate(x1, x2):
    x = np.array([x1,x2])
    weight = np.array([-1,-1])
    bias = 1.5
    y = np.sum( x * weight)+bias
    
    return Step_Function(y)
    
# 4. Step_Function 함수를 구현하세요.
def Step_Function(y):
    if y>=0:
        return 1
    else:
        return 0
    
    
# 5. 구현한 AND, OR, NAND gate 함수들을 활용하여 XOR_gate 함수를 구현하세요. 
def XOR_gate(x1, x2):
    A=NAND_gate(x1,x2)
    B=OR_gate(x1,x2)
    y=AND_gate(A,B)
        
    return y
    

def main():
    # NOR gate에 넣어줄 Input
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # XOR gate를 만족하는지 출력하여 확인
    print('XOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ', XOR_gate(x1, x2))


if __name__ == "__main__":
    main()

 

5. sklearn으로 IRIS 분류하기

import sklearn 
from sklearn import datasets
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Perceptron

# 1. iris data를 읽어 X와 Y에 저장해 반환하는 load_irisdata 함수를 구현하세요.
def load_irisdata():
    iris = datasets.load_iris()
    # iris data
    data = iris.data
    # iris target
    target = iris.target
    
    return data,target

def main():
    # iris data를 읽어 X와 Y에 저장합니다.
    X,Y = load_irisdata()
    
    
    # 2. X, Y 데이터를 훈련용 데이터와 테스트 데이터로 분류합니다.(80:20)
    x_train, x_test, y_train, y_test = train_test_split(X,Y,test_size=0.2,random_state=100)
    
    
    # 3. sklearn의 퍼셉트론 클래스를 사용하여 train 데이터에 대해 학습하세요.
    
    perceptron = Perceptron(max_iter=1000,eta0=1)
    perceptron.fit(x_train,y_train)
    
    
    #4. test 데이터에 대한 예측값을 생성합니다.
    pred = perceptron.predict(x_test)
    
    print("Test 데이터에 대한 정확도 : %f" %accuracy_score(pred, y_test))
    
    return x_train,x_test,y_train,y_test,pred
    
    
if __name__ == "__main__":
    main()
반응형