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')
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
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
In [ ]: