#python #python-3.x #linear-regression #nan #gradient-descent
#python #python-3.x #линейная регрессия #nan #градиентный спуск
Вопрос:
Я хотел попробовать реализовать градиентный спуск самостоятельно, и я написал это:
# Creating random sample dataset
import random as rnd
dataset = []
for i in range(0, 500):
d_dataset = [i, rnd.randint((i-4), (i 4))]
dataset.append(d_dataset)
def gradient_descent(t0, t1, lrate, ds):
length = len(ds)
c0, c1 = 0, 0
for element in ds:
elx = element[0]
ely = element[1]
c0 = ((t0 (t1*elx) - ely))
c1 = ((t0 (t1*elx) - ely)*elx)
t0 -= (lrate * c0 / length)
t1 -= (lrate * c1 / length)
return t0, t1
def train(t0, t1, lrate, trainlimit, trainingset):
k = 0
while k < trainlimit:
new_t0, new_t1 = gradient_descent(t0, t1, lrate, trainingset)
t0, t1 = new_t0, new_t1
k = 1
return t0, t1
print(gradient_descent(20, 1, 1, dataset))
print(train(0, 0, 1, 10000, dataset))
Всякий раз, когда я запускаю это, я получаю несколько нормальный результат от gradient_descent()
, но я получаю (nan, nan)
от train()
функции. Я попытался запустить train
с вводом (0, 0, 1, 10, dataset)
, и я получаю это значение (-4.705770241957691e 46, -1.5670167612541557e 49)
, которое кажется очень неправильным.
Пожалуйста, скажите мне, что я делаю не так и как исправить эту ошибку. Извините, если об этом спрашивали раньше, но я не смог найти никаких ответов о том, как исправить ошибку nan.
Комментарии:
1. Есть ли вероятность, что
length = 0
во время какой-то итерации? Потому что это приведет к делению на ноль
Ответ №1:
При вызове print(train(0, 0, 1, 10000, dataset))
значения, возвращаемые с помощью gradient_descent(t0, t1, lrate, trainingset)
, увеличиваются с каждой итерацией while
цикла. Когда они становятся больше максимально допустимого значения float
, они автоматически преобразуются в float('inf')
, float
представляющее бесконечность. Проверьте это максимальное значение в вашей системе с помощью sys.float_info.max
:
import sys
print(sys.float_info.max)
Однако ваша функция gradient_descent()
не может обрабатывать бесконечные значения, что вы можете проверить с помощью следующего вызова вашей функции:
gradient_descent(float('inf'), float('inf'), 1, dataset)
Проблема здесь в следующих двух строках gradient_descent()
, которые не очень четко определены для t0
и t1
являются бесконечными:
c0 = ((t0 (t1*elx) - ely))
c1 = ((t0 (t1*elx) - ely)*elx)
Комментарии:
1. Большое вам спасибо! Я допустил серьезную ошибку в алгоритме, вот почему это происходит. Спасибо за ваше время!
2. Если мой ответ помог решить вашу проблему и ответил на ваш вопрос, не могли бы вы отметить его как правильный ответ?