아달린 - 퍼셉트론의 향상된 버전
연속함수로 비용 함수를 정의하고 최소화하는 핵심 개념을 보여준다.
아달린 규칙(위드로우-호프 규칙)과 퍼셉트론의 가장 큰 차이점은
가중치를 업데이트 하는데 퍼셉트론처럼 단위 함수 대신 선형 활성화 함수를 사용하는 것이다.
선형 활성화 함수 ϕ(z)는 최종입력과 동일한 함수이다.
아딜린 알고리즘은 진짜 클래스 레이블과 선형 활성화 함수의 실수 출력 값을 비교하여 모델의 오차를 계산하고 가중치를 업데이트 한다.
퍼셉트론은 진짜 클래스 레이블과 예측클래스끼리만 비교한다.
경사하강법으로 비용 함수최소화
지도 학습 알고리즘의 핵심 구성 요소는 학습 과정 동안 최적화하기 위해 정의한 목적함수이다.
보통 비용함수가 목적 함수가 된다.
비용 함수 — 실수를 최소화하기 위해 학습자가 행동을 수정/변경하는 데 도움을 주는것이다.
비용 함수는 X와 y 사이의 관계를 추정하는 능력 측면에서 모형이 얼마나 잘못된지를 측정하는 측도
https://towardsdatascience.com/machine-learning-fundamentals-via-linear-regression-41a5d11f5220
아달린은 계산된 출력과 진짜 클래스 레이블 사이의 제곱오차합(SSE)으로 가중치를 학습할 비용 함수J를 정의한다.
단위 계단 함수 대신 선형 활성화 함수를 사용하는 장점은 비용함수가 미분 가능해 진다는 것이다.
그리고 볼록한 함수라 경사하강법(gradient decent)을 적용하여 붓꽃 데이터 셋의 샘플을 분류하도록 비용함수를 최소화하는 가중치를 찾을 수 있다.
출처:
http://rasbt.github.io/mlxtend/user_guide/general_concepts/gradient-optimization/
이 방법은 전에 포스팅한 밑바닥... 딥러닝 에서 설명해서 넘어간다.
아달린 학습규칙과 퍼셉트론 학습규칙과 다른점은 퍼셉트론은 정수, 아딜린은 실수라는 것이다.
배치경사하강법 : 훈련세트에 있는 모든 샘플을 기반으로 가중치 업데이트를 계산하는것
(각 샘플마다 가중치를 업데이트 하지 않는다.)
class AdalineGD(object):
"""적응형 선형 뉴런 분류기
매개변수
------------
eta : float
학습률 (0.0과 1.0 사이)
n_iter : int
훈련 데이터셋 반복 횟수
random_state : int
가중치 무작위 초기화를 위한 난수 생성기 시드
속성
-----------
w_ : 1d-array
학습된 가중치
cost_ : list
에포크마다 누적된 비용 함수의 제곱합
"""
def __init__(self, eta=0.01, n_iter=50, random_state=1):
self.eta = eta
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.cost_ = []
for i in range(self.n_iter):
net_input = self.net_input(X)
# Please note that the "activation" method has no effect
# in the code since it is simply an identity function. We
# could write `output = self.net_input(X)` directly instead.
# The purpose of the activation is more conceptual, i.e.,
# in the case of logistic regression (as we will see later),
# we could change it to
# a sigmoid function to implement a logistic regression classifier.
output = self.activation(net_input)
errors = (y - output)
self.w_[1:] += self.eta * X.T.dot(errors)
self.w_[0] += self.eta * errors.sum()
cost = (errors**2).sum() / 2.0
self.cost_.append(cost)
return self
def net_input(self, X):
"""최종 입력 계산"""
return np.dot(X, self.w_[1:]) + self.w_[0]
def activation(self, X):
"""선형 활성화 계산"""
return X
def predict(self, X):
"""단위 계단 함수를 사용하여 클래스 레이블을 반환합니다"""
return np.where(self.activation(self.net_input(X)) >= 0.0, 1, -1)
|
cs |
'DATA Science > Python Machine Learning 2nd ed.' 카테고리의 다른 글
퍼셉트론 학습 알고리즘 구현 (0) | 2021.06.03 |
---|---|
간단한 분류/ 알고리즘 훈련! (0) | 2021.05.29 |
개요 (0) | 2021.05.25 |
댓글