In [ ]:
import numpy as np
import math


input_size  = 4
output_size = 3
num_hidden  = 10
In [ ]:
np.random.seed(0)
W1 = np.random.rand(num_hidden, input_size + 1)
W2 = np.random.rand(output_size, num_hidden + 1)
In [ ]:
def sigmoid(x):
    return 1/(1+ math.exp(-x))

vsigmoid = np.vectorize(sigmoid)
In [ ]:
def feed_forward(input_vector):
    outputs = []
    
    for layer in [W1,W2]:
        input_with_bias = np.append(input_vector, 1)
        output = np.inner(layer,input_with_bias)        
        output = vsigmoid(output)
        outputs.append(output)
        input_vector = output
        
    return outputs
In [ ]:
def backpropagation (input_vector,target):
     alpha = 0.1
     global W1,W2
     o1, o2 = feed_forward(input_vector)
     
     e = (o2 - target)


     deltas2 = o2 * (1 - o2) * e          
     W2 -= alpha * np.outer(deltas2, np.append(o1, 1))
     
     deltas1 =  (o1 * (1 - o1)) * np.dot(W2.T, deltas2)[:-1]  
     W1 -= alpha * np.outer(deltas1, np.append(input_vector, 1))
In [ ]:
def predict(input_vector):
    return feed_forward(input_vector)[-1]

def predict_one(input_vector):
    return np.argmax(feed_forward(input_vector)[-1])

def fit(X_train,y_test,n=1000):
    for k in range(n):
        for i in range(len(y_test)): 
            backpropagation(X[i,:],y[i,:])
In [ ]:
            from sklearn import datasets
iris = datasets.load_iris()

X = iris.data
y = np.zeros((len(y),3))
for i,j in enumerate(iris.target): y[i,j]=1

fit(X,y)