如何修复 returns NAN 的函数?
How do I fix a function that returns 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()
得到一个有点正常的输出,但我从 train()
函数得到 (nan, nan)
。我用输入 (0, 0, 1, 10, dataset)
尝试了 运行ning train
,我得到了这个值 (-4.705770241957691e+46, -1.5670167612541557e+49)
,这似乎是非常错误的。
请告诉我哪里做错了以及如何解决这个错误。抱歉,如果之前有人问过这个问题,但我找不到有关如何修复 nan 错误的任何答案。
调用 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)
我想尝试自己实现梯度下降,我写了这个:
# 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)
尝试了 运行ning train
,我得到了这个值 (-4.705770241957691e+46, -1.5670167612541557e+49)
,这似乎是非常错误的。
请告诉我哪里做错了以及如何解决这个错误。抱歉,如果之前有人问过这个问题,但我找不到有关如何修复 nan 错误的任何答案。
调用 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)