XOR Problem


In [1]:
# Function to generate a xor classification problem.
import numpy as np

def do_XOR(n=1000,noisy_n=100,svm=True):
    rng = np.random.RandomState(0)
    X_train = rng.uniform(low=-1.0,high=1.0,size=(n,2))
    Y_train = np.logical_xor(X_train[:,0] > 0, X_train[:,1] > 0)
    Y_train = 2*Y_train-1 if svm else Y_train
    X_noisy= rng.uniform(low=-0.8,high=0.2,size=(noisy_n,2))
    Y_noisy = -1*np.logical_xor(X_noisy[:,0] > 0, X_noisy[:,1] > 0) + 1
    Y_noisy = 2*Y_noisy-1 if svm else Y_noisy
    X_train = np.vstack((X_train, X_noisy))
    Y_train = np.hstack((Y_train, Y_noisy))
    X_test = rng.uniform(low=-1.0,high=1.0,size=(n,2))
    Y_test = np.logical_xor(X_test[:,0] > 0, X_test[:,1] > 0)
    Y_test = 2*Y_test - 1 if svm else Y_test
    return X_train,Y_train,X_test,Y_test

In [2]:
# Auxiliary function to get info about models.
from sklearn.metrics import classification_report
def score_the_model(model,x,y,xt,yt,text):
    acc_tr = model.score(x,y)
    acc_test = model.score(xt[:-1],yt[:-1])
    print "Training Accuracy %s: %f"%(text,acc_tr)
    print "Test Accuracy %s: %f"%(text,acc_test)
    print "Detailed Analysis Testing Results ..."
    print

In [3]:
X_train,Y_train,X_test,Y_test = do_XOR(n=1000,noisy_n=100,svm=False)

In [4]:
# Model without hidden layer.
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
n_h=1
model = Sequential()
model.add(Dense(1, activation='sigmoid', kernel_initializer='uniform', input_dim=X_train.shape[1]))
model.compile(optimizer=SGD(lr=1), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=50, batch_size=100, verbose=0)
scores = model.evaluate(X_test, Y_test, verbose=0)
test_acc = scores
print "Test Accuray:", test_acc[1]
#plot_classifier(model, X_train, Y_train, X_test, Y_test, 'ann')


Using TensorFlow backend.
Test Accuray: 0.597

In [5]:
# ANN with 1 hidden layer
n_h = 8
model = Sequential()
model.add(Dense(n_h, input_dim=X_train.shape[1], kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
model.compile(optimizer=SGD(lr=1), loss='binary_crossentropy', metrics=['accuracy'])

model.fit(X_train, Y_train, epochs=50, batch_size=100, verbose=0)

test_acc = model.evaluate(X_test, Y_test, verbose=False)[1]
train_acc = model.evaluate(X_train, Y_train, verbose=False)[1]

print "Train Accuracy:", train_acc
print "Test Accuray:", test_acc


Train Accuracy: 0.870909090936
Test Accuray: 0.93

In [6]:
# Custom predictions
x_cust = np.array([[-0.2, 0.67]])
print model.predict(x_cust) >= 0.5

x_cust = np.array([[0.2, 0.67]])
print model.predict(x_cust) >= 0.5


[[ True]]
[[False]]

In [ ]: