import numpy as np
from functools import reduce
class Perceptron(object):
def __init__(self, input_num, activator):
self.activator = activator
self.weights = [ for _ in range(input_num)]
self.bias =
def __str__(self):
return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
def predict(self, input_vec):
return self.activator(
reduce(lambda a, b: a + b, [x_w[] * x_w[] for x_w in zip(input_vec, self.weights)], ) + self.bias)
def train(self, input_vecs, labels, iteration, rate):
for i in range(iteration):
self._one_iteration(input_vecs, labels, rate)
def _one_iteration(self, input_vecs, labels, rate):
samples = list(zip(input_vecs, labels))
for (input_vec, label) in samples:
output = self.predict(input_vec)
self._update_weights(input_vec, output, label, rate)
def _update_weights(self, input_vec, output, label, rate):
delta = label - output
self.weights = [x_w1[] + rate * delta * x_w1[] for x_w1 in zip(input_vec, self.weights)]
self.bias += rate * delta
def f(x):
return if x > else
def get_training_dataset():
input_vecs = [[,], [,], [,], [,]]
labels = [, , , ]
return input_vecs, labels
def train_and_perceptron():
p = Perceptron(, f)
input_vecs, labels = get_training_dataset()
p.train(input_vecs, labels, , )
return p
if __name__ == '__main__':
and_perception = train_and_perceptron()
print (and_perception)
print ('1 and 1 = %d' % and_perception.predict([, ]))
print ('0 and 0 = %d' % and_perception.predict([, ]))
print ('1 and 0 = %d' % and_perception.predict([, ]))
print ('0 and 1 = %d' % and_perception.predict([, ]))