Машинное обучение линейной регрессии нан значения при выполнении градиентного спуска - PullRequest
0 голосов
/ 06 января 2019

У меня есть простой код, я пытаюсь линейной регрессии на синусе в интервале от 0 до 2pi, я пытаюсь определить коэффициенты расширения тейлора синуса с линейной регрессией, но когда я добавляю до членов 5-го порядка, это дает мне значения нан в моих весах, как я делаю градиентный спуск

есть следующий код

и это дает мне такую ​​ошибку результат

что может быть причиной? Я попытался инициализировать очень малые веса, но это не сработало, однако, когда я минимизирую скорость обучения до e-9, он начинает что-то делать, но процесс идет очень медленно

import numpy as np

#import matplotlib.pyplot as plt


class Linear_Regression(object):
    def __init__(self):
        return None


    def fit(self, X,
            Y,
            learning_rate = 0.000001,
            epoch = 5000,
            momentum = 0,
            print_period = 250):
        #if print period is 0 it never prints 
        #dont forget that X should come with a column of 1's (constant)
        #this ill be equivalent to bias 
        #cofficient will be automatically calcualated by gradiend descent 
       cost_array = []
       N, M = X.shape
       W = np.random.randn(M)

       for step in range(0, epoch):
           Y_pred = X.dot(W)
           derivative = X.T.dot(Y_pred - Y)
           W = W - momentum*W - learning_rate*derivative

            if step % (print_period)  == 0:
                #this if else statement ensures that if print period is 
                cost = error_rate_ish_linear(Y_pred, Y)
                cost_array.append(cost)
                print('iterateion', str(step))
                print(cost)

        self.W = W
        return X.dot(W), cost_array

   def predict(self, X):
        Weights = self.W
        return X.dot(Weights)

def error_rate_ish_linear(Y, Yhat):
    dif =  np.abs(Y - Yhat)
    return dif.sum()

x1 = np.linspace(0, 2*np.pi, 30).reshape(-1,1)
y = np.sin(x1)

#x = np.append(x1, bias, axis = 1)
x = np.append(x1, x1**2, axis = 1)
x = np.append(x, x1**3, axis = 1)
x = np.append(x, x1**4, axis = 1)
x = np.append(x, x1**5, axis = 1)
#x = np.append(x, x1**6, axis = 1)
#x = np.append(x, x1**7, axis = 1)
#x = np.append(x, x1**8, axis = 1)

y = y.flatten()


linar = Linear_Regression()
zaza = linar.fit(x,y, epoch = 10000, learning_rate = 1e-5, print_period = 250)

gela = linar.predict(x)
...