【问题标题】:How do I fix a function that returns NAN?如何修复返回 NAN 的函数?
【发布时间】:2021-01-27 08:17:49
【问题描述】:

我想尝试自己实现梯度下降,我写了这个:

# 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() 得到一些正常的输出,但我会从 train() 函数得到 (nan, nan)。我尝试使用输入(0, 0, 1, 10, dataset) 运行train,我得到了这个值(-4.705770241957691e+46, -1.5670167612541557e+49),这似乎非常错误。

请告诉我我做错了什么以及如何解决这个错误。抱歉,如果之前有人问过这个问题,但我找不到任何关于如何修复 nan 错误的答案。

【问题讨论】:

  • 在某些迭代中是否有可能length = 0?因为那会导致除以零

标签: python python-3.x linear-regression nan gradient-descent


【解决方案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() 中的以下两行,因为t0t1 是无限的,所以没有很好地定义:

c0 += ((t0 + (t1*elx) - ely)) 
c1 += ((t0 + (t1*elx) - ely)*elx) 

【讨论】:

  • 非常感谢!我在算法中犯了一个重大错误,这就是为什么会发生这种情况。感谢您的宝贵时间!
  • 如果我的回答帮助解决了您的问题并回答了您的问题,请您标记为正确答案吗?
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2021-05-10
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多