У меня есть простой код, я пытаюсь линейной регрессии на синусе в интервале от 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)