|
@ -0,0 +1,65 @@ |
|
|
|
|
|
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) |