如何解决如何修复返回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()
中的以下两行,对于t0
和t1
是无限的,它们没有很好地定义:
c0 += ((t0 + (t1*elx) - ely))
c1 += ((t0 + (t1*elx) - ely)*elx)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。