Градиентный спуск в Python 3 - PullRequest
0 голосов
/ 31 марта 2019

У меня есть код Gradient Descent в Python 3, и появляется ошибка, я не знаю, как ее решить ...

и у меня есть вопрос, почему результат набора данных дает мне ноль за точность, кто-нибудь может мне помочь, пожалуйста: (

Я пытаюсь изменить некоторые вещи, но безрезультатно.

Я делю свой набор данных на две части для тренировочного набора и для тестового набора

import csv
import numpy as np
import matplotlib.pyplot as plt

N_EPOCHS = 10
LEARNING_RATE = .1
PLOT = False
LAMBDA = .00000001

def load_data(filename):
    X = []
    Y = []


    with open(filename, 'r') as csvfile:
        X = [[float(x) for x in line] for line in csv.reader(csvfile, delimiter=',')]

        for line in X:
            Y.append([line[-1]])
            line.pop()

        print(X[0])
        print(Y)

    X = np.array(X, dtype=np.longdouble)
    Y = np.array(Y, dtype=np.longdouble)
    return X, Y

def sigmoid(weight_param, x_param):
    denom_sigmoid = np.longdouble(1 + np.exp(np.dot(-weight_param, x_param)))
    sig = np.longdouble(np.divide(1, denom_sigmoid, where=denom_sigmoid!=0.0))
    return sig

def gradient_descent(X, Y, L2_Regularization=False):

    example_accuracy = []
    X = np.c_[np.ones((X.shape[0])), X]  # Add bias of 1 to each example
    feature_len = X.shape[1]
    example_count = np.long(X.shape[0])
    print("X.shape ", X.shape)
    # Random weight vector with shape equal to number of features
    w = np.zeros(feature_len)
    l2_reg = 0
    step = 0
    correct_count = 0
    while(step < N_EPOCHS):
        print("Iteration: ", step)
        grad = np.zeros(feature_len, dtype=np.float)
        for example in range(example_count):
            # y_hat is the predicted output
            y_hat = sigmoid(w.T, X[example])
            if L2_Regularization:
                l2_reg = LAMBDA * w  # = d/dw(.5*lambda*||w^2||)

            if y_hat >= .5:
                y_hat = 1
            loss = y_hat - Y[example]
            if loss[0] == 0:
                correct_count += 1
                print(correct_count)
            grad += loss[0] * X[example] + l2_reg

        w += -LEARNING_RATE * grad

        step += 1
        example_accuracy.append(np.float(correct_count / example_count))
        correct_count = 0


    print(" Accuracy per Epoch: ", example_accuracy)

    return w, example_accuracy

def main():

    X, Y = load_data("/Users/mahaalmotiri/PycharmProjects/desktop/GradientDescent /data.csv")
    X_test, Y_test = load_data("/Users/mahaalmotiri/PycharmProjects/desktop/GradientDescent /data2.csv")

    w, example_accuracy = gradient_descent(X, Y)
    epoch_list = [epoch for epoch in range(N_EPOCHS)]
    if PLOT:
        plt.plot(epoch_list, example_accuracy)
        plt.xlabel('Epoch')
        plt.ylabel('Accuracy')
        plt.show()

    w_L2_train, example_accuracy_L2_train = gradient_descent(X, Y, L2_Regularization=True)
    w_L2_test, example_accuracy_L2_test = gradient_descent(X_test, Y_test, L2_Regularization=True)
    print("Example accuracy no L2_Regularization: ", example_accuracy)
    print("example_accuracy_L2_train: ", example_accuracy_L2_train)
    print("example_accuracy_L2_test: ", example_accuracy_L2_test)


if __name__ == "__main__":
    main()

ошибка enter image description here

1 Ответ

0 голосов
/ 31 марта 2019

Это предупреждение означает, что степень np.dot(-weight_param, x_param) здесь слишком велика:

denom_sigmoid = np.longdouble(1 + np.exp(np.dot(-weight_param, x_param)))

, поэтому вы получите большое число после вычисления показателя степени.

Если вы хотите избавиться отэто вам просто нужно сделать его меньше.Может быть, вы хотите нормализовать ваши входные данные, используя sklearn .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...