In [15]:
import numpy as np

# Based on Siraj's NN.
class NeuralNetwork():
    def __init__(self):
        np.random.seed(1)
        
        self.weights = 2 * np.random.random((3,1)) - 1
        
    def __sigmoid(self, x):
        return 1/(1 + np.exp(-x))
    
    def __sigmoid_derivative(self, x):
        return x * (1 - x)
    
    def train(self, training_set, training_labels, num_iterations):
        for i in range(num_iterations):
            predictions = self.predict(training_set)
            
            error = training_labels - predictions
            
            adjustments = np.dot(training_set.T, error * self.__sigmoid_derivative(predictions))
            
            self.weights += adjustments
    
    def predict(self, inputs):
        return self.__sigmoid(np.dot(inputs, self.weights))
        

nn = NeuralNetwork()

print('Random weight initializations:')
print(nn.weights)

training_set = np.array([
    [0,0,1],
    [1,1,1],
    [1,0,1],
    [0,1,1]
])

training_labels = np.array([
    [
        0,
        1,
        1,
        0
    ]
]).T

nn.train(training_set, training_labels, num_iterations=10000)

print('Trained weights:')
print(nn.weights)

print('Prediction test:')
prediction = nn.predict(np.array([1,0,0]))
print(prediction, '-->', int(np.rint(prediction)[0]))


Random weight initializations:
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
Trained weights:
[[ 9.67299303]
 [-0.2078435 ]
 [-4.62963669]]
Prediction test:
[0.99993704] --> 1