#!/usr/bin/env python2 from operator import add, mul def pointwise(op, x, y): return [op(a, b) for (a, b) in zip(x, y)] def scalar_product(x, y): """Scalar product.""" return sum(pointwise(mul, x, y)) def scalar_multiplication(s, v): """Scalar multiplication.""" return [s*i for i in v] # data extracted from corpus x = {1 : [ 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ], 2 : [ 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ], 3 : [ 0 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 ], 4 : [ 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ], 5 : [ 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 1 ], 6 : [ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 ], 7 : [ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 ], 8 : [ 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 ], 9 : [ 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ], 10 : [ 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 2 ]} y = {1:1, 2:-1, 3:-1, 4:1, 5:1, 6:1, 7:1, 8:-1, 9:1, 10:-1} # learning rate alpha = 0.5 # initialize parameters w = [0,0,0,0,0,0,0,0,0] rho = 0 turn = 1 errors = True # perceptron algorithm while errors: print "\nTurn", turn turn += 1 errors = False for i in x.keys(): print "i =", i trigger = y[i] * (scalar_product (w, x[i]) + rho) if trigger <= 0: errors = True w = pointwise(add, w, scalar_multiplication(alpha*y[i], x[i])) rho += alpha*y[i] print w, rho