|
|
@ -0,0 +1,41 @@ |
|
|
|
import numpy as np |
|
|
|
|
|
|
|
class Perceptron(object): |
|
|
|
"""Implements a perceptron network""" |
|
|
|
def __init__(self, input_size, lr=1, epochs=100): |
|
|
|
self.W = np.zeros(input_size+1) |
|
|
|
# add one for bias |
|
|
|
self.epochs = epochs |
|
|
|
self.lr = lr |
|
|
|
|
|
|
|
#activation function |
|
|
|
def activation_fn(self, x): |
|
|
|
#return (x >= 0).astype(np.float32) |
|
|
|
return 1 if x >= 0 else 0 |
|
|
|
|
|
|
|
#we need a prediction function to run an input through the perceptron and return an output. |
|
|
|
def predict(self, x): |
|
|
|
z = self.W.T.dot(x) |
|
|
|
a = self.activation_fn(z) |
|
|
|
return a |
|
|
|
|
|
|
|
def fit(self, X, d): |
|
|
|
for _ in range(self.epochs): |
|
|
|
for i in range(d.shape[0]): |
|
|
|
x = np.insert(X[i], 0, 1) |
|
|
|
y = self.predict(x) |
|
|
|
e = d[i] - y |
|
|
|
self.W = self.W + self.lr * e * x |
|
|
|
#the easiset set of data that we can provide is the AND gate. Given is set of inputs and outputs. |
|
|
|
if __name__ == '__main__': |
|
|
|
X = np.array([ |
|
|
|
[0, 0], |
|
|
|
[0, 1], |
|
|
|
[1, 0], |
|
|
|
[1, 1] |
|
|
|
]) |
|
|
|
d = np.array([0, 0, 0, 1]) |
|
|
|
|
|
|
|
perceptron = Perceptron(input_size=2) |
|
|
|
perceptron.fit(X, d) |
|
|
|
print(perceptron.W) |