Как мне исправить функцию, которая возвращает NAN?

#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. Если мой ответ помог решить вашу проблему и ответил на ваш вопрос, не могли бы вы отметить его как правильный ответ?