Davids perceptron.pl
Jump to navigation
Jump to search
#!/usr/bin/env python __author__ = "David Stainton" __license__ = "Apache License" 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()