Professional Documents
Culture Documents
/usr/bin/python
import sys
from numpy import random, linalg
import numpy
import math
def sign(x):
return 1 if x>=0 else -1
def classify(x,y,slope,intercept):
'''
classify point (x,y) against line (y = slope*x + intercept)
point in region with origin is classified negative
point in region without origin is classified positive
'''
m=y/x
x_=intercept/(m-slope)
y_=m*x_
v1=numpy.array([x,y])
v2=numpy.array([x_,y_])
if(numpy.dot(v1,v2)<0):
return -1
r=linalg.norm(v1)
r_=linalg.norm(v2)
return sign(r-r_)
def predict(X,W):
'''
predict classification of points in X, using perceptron params W
'''
predictions=[]
for v in X:
v_=numpy.concatenate(([1], v))
predictions.append(sign(numpy.dot(v_,W)))
return numpy.array(predictions)
def accuracy(Y_act,Y_pred):
'''
perceptron accuracy, Y_actual vs Y_predicted
'''
test=[]
for i in range(0,len(Y_act)):
test.append(1 if Y_act[i]==Y_pred[i] else 0)
return numpy.mean(test)
def generate_data(N, slope, intercept):
'''
generate N points classified as positive/negative
using line defined by slope and intercept
'''
X=random.uniform(-1.,1.,size=(N,2))
Y=numpy.empty(N)
for i in range(0,N):
Y[i]=classify(*X[i],slope=slope,intercept=intercept)
return X,Y
def perceptron_learning(X,Y):
'''
perceptron learning algorithm
sys.exit(-1)
NUM_TESTS = int(sys.argv[1])
NUM_TRAIN = int(sys.argv[2])
main(NUM_TESTS, NUM_TRAIN)