from random import choice
from numpy import array, dot, random

#Declare activation function
def stepFunction(value):
    if value <= 0:
        return 0
    else:
        return 1
        
#Define training data
training_data = [
    (array([0,0,1]), 0),
    (array([0,1,1]), 0),
    (array([1,0,1]), 1),
    (array([1,1,1]), 1)
]

#Define test data
test_data = [
    (array([0,0,0])),
    (array([0,1,0])),
    (array([1,1,1])),
    (array([0,0,1])),
    (array([1,0,0]))
]

w = random.rand(3)
errors = []
eta = 0.2
n = 1000

print("Training Perceptron for {} iterations").format(n)
print("Starting weights: {}").format(w)

for i in xrange(n):
    x, expected = choice(training_data)
    result = dot(w, x)
    error = expected - stepFunction(result)
    errors.append(error)
    w += eta * error * x
    print ".",
    
print ""
print "Training completed"
print("Weights after training: {}").format(w)
print("Running trained network against test data")
for x in test_data:
    result = dot(x, w)
    print("{}: {} -> {}").format(x[:3], result, stepFunction(result))