import numpy as np
|
|
class Perceptron(object):
|
|
"""
|
|
Perceptron classifier
|
|
___________________
|
|
parameters
|
|
__________________
|
|
eta: float
|
|
learning rate betweeen 0.0 and 1.0
|
|
n_iter: int
|
|
Passes over the training dataset
|
|
|
|
___________________
|
|
Attributes
|
|
___________________
|
|
w_: 1d array
|
|
weights after training
|
|
errors_: list
|
|
Number of msiclassifications for every epoch
|
|
"""
|
|
def __init__(self, eta, n_iter):
|
|
self.eta = eta
|
|
self.n_iter = n_iter
|
|
|
|
def fit(self, X, y):
|
|
"""
|
|
Fit training data
|
|
______________________
|
|
parameters
|
|
______________________
|
|
X: {array-like}, shape = [n_samples, n_features]
|
|
Training vectors where n_samples is the number of samples
|
|
and n_features is the number of features
|
|
y: array-like, shape = [n_samples]
|
|
Target values
|
|
|
|
____________________
|
|
Returns
|
|
____________________
|
|
self: object
|
|
"""
|
|
self.w_ = np.zeros(1 + X.shape[1])
|
|
self.errors_ = []
|
|
|
|
for _ in range(self.n_iter):
|
|
errors = 0
|
|
for xi,target in zip(X, y):
|
|
update = self.eta * (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):
|
|
"""
|
|
Calculate net input
|
|
"""
|
|
return np.dot(X, self.w_[1:]) + self.w_[0]
|
|
|
|
def predict(self, X):
|
|
"""
|
|
Return class label after unit step
|
|
"""
|
|
return np.where(self.net_input(X) >= 0.0, 1, -1)
|