def sine_training():
    n = NeuralNet([1, 5, 1])
    sines = get_sines(10)
    testing_data = next(sines)

    for i in range(1000):
        x, y = next(sines)
        n.train(x, y, 10, 1, testing_data=testing_data)

    # validation
    x, y = next(sines)
    hx = n.predict(x)

    errors = []
    print('doing validation---------------------------')
    for x, y, y_predicted in zip(x, y, hx):
        errors.append(abs(y[0] - y_predicted[0]) / y[0])
        print(x[0], y[0], y_predicted[0])

    print(sum(errors) / len(errors))

    x = np.reshape([2 * math.pi * i/1000 for i in range(1000)], (1000, 1))
    y = [(i[0] - 0.5)*2 for i in n.predict(x)]
    y_actual = [i[0] for i in np.sin(x)]

    plt.plot(x, y_actual)
    plt.hold(True)
    plt.plot(x, y)
    plt.show()
def sine_training():
    n = NeuralNet([1, 5, 1])
    sines = get_sines(10)
    testing_data = next(sines)

    for i in range(1000):
        x, y = next(sines)
        n.train(x, y, 10, 1, testing_data=testing_data)

    # validation
    x, y = next(sines)
    hx = n.predict(x)

    errors = []
    print('doing validation---------------------------')
    for x, y, y_predicted in zip(x, y, hx):
        errors.append(abs(y[0] - y_predicted[0]) / y[0])
        print(x[0], y[0], y_predicted[0])

    print(sum(errors) / len(errors))

    x = np.reshape([2 * math.pi * i / 1000 for i in range(1000)], (1000, 1))
    y = [(i[0] - 0.5) * 2 for i in n.predict(x)]
    y_actual = [i[0] for i in np.sin(x)]

    plt.plot(x, y_actual)
    plt.hold(True)
    plt.plot(x, y)
    plt.show()
def validate(reader, weights):
    data_stream = reader.get(30, mode='validation')

    n = NeuralNet(metadata['layers'])
    n.weights = weights

    counter = 0
    matches = 0

    for x, y in data_stream:
        counter += x.shape[0]
        predicted = n.predict(x)
        p_digits = np.argmax(predicted, axis=1)
        y_digits = np.argmax(y, axis=1)
        accuracy = sum([1 if i == j else 0 for i, j in zip(p_digits, y_digits)]) / len(p_digits)

        print 'predicted-\n', p_digits
        print 'actual-\n', y_digits
        print('accuracy-{0}%'.format(round(accuracy * 100, 2)))
        return None     # Let's just run only one loop for the time being