import numpy as np

class Perceptron:
    def __init__(self,eta=0.1,n_iter=10):
        self.eta=eta
        self.n_iter=n_iter

    def fit(self,X,y):
        self.weights=np.zeros(1+X.shape[1])
        self.errors=[]

        for _ in range(self.n_iter):
            error=0
            for xi,target in zip(X,y):
                update=self.eta*(target-self.predict(xi))
                self.weights[1:]+=update*xi
                self.weights[0]+=update
                error+=int(update!=0.0)

            self.errors.append(error)
        return self

    def net_input(self,X):
        return np.dot(X,self.weights[1:])+self.weights[0]

    def predict(self,X):
        return np.where(self.net_input(X)>=0.0, 1,-1)
