본문 바로가기

AI

1201 - 퍼셉트론

728x90

딥러닝 기초 - Perceptron


Iris 꽃 분류 문제를 해결하기위한 퍼셉트론 모델 구현.

import numpy as np

class Perceptron(object):
    """ 
    퍼셉트론 분류기
    
    매개변수
    ------------
    learning_rate : float
      학습률 (0.0과 1.0 사이)
    n_iter : int
      훈련 데이터셋 반복 횟수
    random_state : int
      가중치 무작위 초기화를 위한 난수 생성기 시드
      
    속성
    ------------
    w_ : 1d-array
      학습된 가중치
    errors_ : list
      에포크마다 누적된 분류 오류
    
    """
    
    def __init__(self, learning_rate=0.01, n_iter=50, random_state=1):
        self.learning_rate = learning_rate
        self.n_iter = n_iter
        self.random_state = random_state
        
    def fit(self, X, y):
        """
        훈련 데이터 학습

        매개변수
        -------------
        X : {array-like}, shape = [n_samples, n_features]
          n_samples개의 샘플과 n_features개의 특성으로 이루어진 훈련 데이터
        y : array-like, shape = [n_samples]
          타깃 값

        반환값
        -------
        self : object

        """

        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc = 0.0, scale = 0.01, size = 1 + X.shape[1])
        self.errors_ = []

        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):
                update = self.learning_rate * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0)
            self.errors_.append(errors)
        return self
    
    
    
    
    def net_input(self, X):
        """입력 계산 ; """
        return np.dot(X, self.w_[1:])+self.w_[0]
    
    def predict(self, X):
        """단위 계단 함수를 사용하여 클래스 레이블을 반환 ; 0보다 크거나 같으면 1, 작으면 -1 반환"""
        return np.where(self.net_input(X) >= 0.0, 1, -1)
◆ 이해하기 ◆
- target이 setosa면 -1, versicolor면 1
- w_[0] 는 bias
- w_[1:] 는 weight
- net_input 은 wX + b 
- predict는 wX+b가 0과 같거나 0보다 크면 1, 0보다 작으면 -1
- update 는 '학습률(0.1)'  *  '목표(-1 or 1)' - '예측(1 or -1)' 
- update 는 0.2 or 0 or -0.2 (예측과 실제가 같으면 0, 다르면 0.2 or -0.2)
- 따라서, 예측과 실제가 다르면 가중치를 업데이트하고 errors에 포함.
- 최적의 분류선을 만드는 가중치와 편향을 구함.

 

Iris 입력 데이터에서 X, y 설정하기.

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

df = pd.read_csv(url, header=None, encoding='utf-8')

# 데이터 프레임 0~99번 인덱스, 4번째 컬럼(class)의 값이 setosa면 1, 아니면 -1 값을 가지는 array
y = df.iloc[0:100, 4].values
y = np.where( y == 'Iris-setosa', -1, 1)

# 데이터 프레임 0~99번 인덱스에서 꽃받침 길이[0번 컬럼]와 꽃잎 길이[2번 컬럼]를 추출
X = df.iloc[0:100, [0, 2]].values

 

 

 

학습

ppn = Perceptron(learning_rate=0.1, n_iter=10)

ppn.fit(X, y)

 

결과

가중치와 편향
0을 기준으로 0보다 크거나 같을 때 또는 0보다 작을 때, 두 가지 경우로 나뉨. 
그래프로 구분된 모습을 확인

 

'AI' 카테고리의 다른 글

1208 - 서포트백터머신  (0) 2021.12.08
1207 - 로지스틱회귀  (0) 2021.12.07
1207 - 아달린 SGD  (0) 2021.12.07
1202 - 아달린  (0) 2021.12.02
Kaggle 준비 해보기(1)  (0) 2021.08.16