如何修复返回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,trainlimit,trainingset): k = 0 while k < trainlimit: new_t0,new_t1 = gradient_descent(t0,trainingset) t0,t1 = new_t0,new_t1 k += 1 return t0,t1 print(gradient_descent(20,1,dataset)) print(train(0,10000,dataset)) 得到一些正常的输出,但是会从gradient_descent()函数得到(nan,nan)。我尝试使用输入train()运行train,但得到这个值(0,10,dataset),这似乎很错误

请告诉我我在做什么错以及如何解决错误。抱歉,以前是否有人问过这个问题,但我找不到如何解决nan错误的答案。

解决方法

调用print(train(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'),dataset)

这里的问题是gradient_descent()中的以下两行,对于t0t1是无限的,它们没有很好地定义:

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