# Davids perceptron.pl

```#!/usr/bin/env python

__author__ = "David Stainton"

import sys

class perceptron(object):

def __init__(self, values):
self.weight = []
# is threshold equivalent to bias?
# http://en.wikipedia.org/wiki/Perceptron
self.threshold = .5
self.learning_rate = .1
for value in values:
self.weight.append(value)

def eval(self, input):
sum = dot_product(input, self.weight)
if sum == self.threshold:
output = 0
if sum < self.threshold:
output = 0
if sum > self.threshold:
output = 1
return output

# returns a boolean indicating if the output matches the expected output
def train(self, input, expected):
output = self.eval(input)
if output != expected:
for elk in range(0,len(input)):
if input[elk] == 1:
change = (expected - output) * self.learning_rate
#print "%s %s" % (elk, change)
self.weight[elk] += change
return False

return True

def dot_product(a, b):
sum = 0
i = 0
while i < len(a):
sum += a[i] * b[i]
i += 1
return sum

def main():

# training set :
#  a list of expected values for each input list
# in this case the training set will teach boolean or

expect = [1,0,1,1]
input = [[1,1], [0,0], [0,1], [1,0]]

# try to expose our perceptron to the training set 10 times
repeat = 10

# create a perceptron object and initialize weight values...
p = perceptron([0,0])

# repeatedly train with the training data set
for c in range(0,repeat):
results = []

for elk in range(len(expect)):
results.append(p.train(input[elk], expect[elk]))
print(p.weight)

# if the training doesn't return an error for the entire set
# then stop training
if False not in results:
break

print(p.weight)

print "training complete."

# and now we use the trained perceptron
# to evaluate the sets of data..

for i in input:
output = p.eval(i)
print "%s eval = %s" % (i,output)

print "---"

# of course this below training set doesn't make
# sense from a boolean logic view point;
# nevertheless i had to try it...

input2 = [[1.2,1.3], [0.2,0.7], [0,.5], [1,0]]

for i in input2:
output = p.eval(i)
print "%s eval = %s" % (i,output)

if __name__ == "__main__":
main()
```