퍼셉트론처럼 개별 훈련 샘플마다 평가한 후 가중치를 업데이트하지 않고 전체 훈련 데이터셋을 기반으로 그레이디언트를 계산합니다. 절편 유닛의 경우 self.eta * 2.0 * errors.mean()을 계산합니다. 여기에서 errors는 편도 함수 값 을 담은 배열입니다. 비슷한 방식으로 가중치를 업데이트 합니다. 하지만 편도 함수 을 통한 가중치 업데이트는 특성 값 xj를 사용합니다. 각 가중치에 대한 특성 값과 errors를 곱해 계산할 수 있습니다.
for w_j in range(self.w_.shape[0]):
self.w_[w_j] += self.eta *
(2.0 * (X[:, w_j]*errors)).mean()
for 루프를 사용하지 않고 더 효율적으로 가중치 업데이트를 구현하려면 특성 행렬과 오차 벡터 사이의 행렬-벡터 곱셈을 사용할 수 있습니다.
self.w_ += self.eta * 2.0 * X.T.dot(errors) / X.shape[0]
이 코드의 activation 메서드는 단순한 항등 함수(identity function)이기 때문에 아무런 영향을 미치지 않습니다. 단일층 신경망을 통해 정보가 어떻게 흘러가는지 일반적인 개념을 표시하려고 (activation 메서드에서 계산되는) 활성화 함수를 추가했습니다. 입력 데이터의 특성에서 최종 입력, 활성화, 출력 순으로 진행됩니다.