双标量中遇到溢出错误
Overflow error encountered in double scalars
嗨,我正在尝试进行线性回归,当我尝试 运行 代码时,这发生在我身上
代码是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('train.csv')
df = data.dropna()
X = np.array(df.x)
Y = np.array(df.y)
def compute_error(x,y,m,b):
error = 0
for i in range(len(x)):
error+= (y[i]-(m*x[i]+b))**2
return error / float(len(x))
def step_graident_descent(x,y,m,b , alpha):
N = float(len(x))
b_graident = 0
m_graident = 0
for i in range(0 , len(x)):
x = X[i]
y = Y[i]
b_graident +=(-2/N) * (y-(m*x+b))
m_graident += (-2/N) * x*(y-(m*x+b))
new_m = m - alpha*m_graident
new_b = b - alpha*b_graident
return new_m , new_b
def graident_decsent(x,y,m,b,num_itters,alpha):
for i in range(num_itters):
m,b = step_graident_descent(x,y,m,b,alpha)
return m,b
def run():
b=0
m=0
numberOfIttertions = 1000
m,b = graident_decsent(X , Y ,m,b,numberOfIttertions , 0.001)
print(m,b)
if __name__ == '__main__':
run()
我得到的错误是:
linearRegression.py:22: RuntimeWarning: overflow encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
linearRegression.py:21: RuntimeWarning: invalid value encountered in double_scalars
b_graident +=(-2/N) * (y-(m*x+b))
linearRegression.py:22: RuntimeWarning: invalid value encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
如果有人能帮助我,我会非常感谢,因为我坚持了大约两个月,谢谢
编辑:tl;dr 解决方案
好的,这是我所说的最小可重现示例。我用以下内容替换你的 X,Y。
n = 10**2
X = np.linspace(0,10**6,n)
Y = 1.5*X+0.2*10**6*np.random.normal(size=n)
如果我那么运行
b=0
m=0
numberOfIttertions = 1000
m,b = graident_decsent(X , Y ,m,b,numberOfIttertions , 0.001)
我完全明白你描述的问题。唯一令人惊讶的是解决方案的简便性。我只是将您的 alpha 替换为 10**-14,一切正常。
为什么以及如何给出一个最小的、可重现的例子
您的示例无法重现,因为我们没有 train.csv
。通常,为了让您自己理解您的问题并获得具体的答案,提供一个非常小的示例供人们 运行 和修改它是 非常 很有帮助的。例如。也许你可以想到一个更短的回归输入,这也会导致这个错误。
第一个 RuntimeWarning
但是现在回答你的问题。你的第一个 RuntimeWarning
即
linearRegression.py:22: RuntimeWarning: overflow encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
表示 x
,因此 m_graident
是 numpy.double=numpy.float64
类型。此数据类型可以存储 (-1.79769313486e+308, 1.79769313486e+308).
范围内的数字,如果变大或变小,则称为溢出。例如。
np.double(1.79769313486e+308)
仍然可以,但是如果你将它乘以 1.1
你会得到你最喜欢的 运行 时间警告。请注意,这是 'just' 警告并且仍然是 运行s。但它不能给你一个数字,因为它太大了。相反,它会给你 inf
.
其他RuntimeWarnings
好的,但是什么
linearRegression.py:21: RuntimeWarning: invalid value encountered in double_scalars
b_graident +=(-2/N) * (y-(m*x+b))
是什么意思?
它来自于我刚才提到的无穷大计算。一些无穷大的计算是有效的。
np.inf-10**6 -> inf
np.inf+10**6 -> inf
np.inf/10**6 -> inf
np.inf*10**6 -> inf
np.inf*(-10**6) -> -inf
1/np.inf -> 0
np.inf *np.inf -> inf
但有些不是,给出 nan
即不是数字。
np.inf/np.inf
np.inf-np.inf
这些在数学中被称为不确定形式,因为它取决于你如何到达无穷大你会得到什么。例如
(np.double(1e+309)+np.double(1e+309))-np.double(1e+309)
np.double(1e+309)-(np.double(1e+309)+np.double(1e+309))
都是 inf-inf
,但您会期望得到不同的结果。
得到 nan
是不幸的,因为使用 nan
的计算结果总是 nan
。一旦添加了 nan
.
,就不能再使用渐变了
其他资源
另一种选择是使用现有的线性回归实现。例如。来自 scikit-learn
。参见
嗨,我正在尝试进行线性回归,当我尝试 运行 代码时,这发生在我身上 代码是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('train.csv')
df = data.dropna()
X = np.array(df.x)
Y = np.array(df.y)
def compute_error(x,y,m,b):
error = 0
for i in range(len(x)):
error+= (y[i]-(m*x[i]+b))**2
return error / float(len(x))
def step_graident_descent(x,y,m,b , alpha):
N = float(len(x))
b_graident = 0
m_graident = 0
for i in range(0 , len(x)):
x = X[i]
y = Y[i]
b_graident +=(-2/N) * (y-(m*x+b))
m_graident += (-2/N) * x*(y-(m*x+b))
new_m = m - alpha*m_graident
new_b = b - alpha*b_graident
return new_m , new_b
def graident_decsent(x,y,m,b,num_itters,alpha):
for i in range(num_itters):
m,b = step_graident_descent(x,y,m,b,alpha)
return m,b
def run():
b=0
m=0
numberOfIttertions = 1000
m,b = graident_decsent(X , Y ,m,b,numberOfIttertions , 0.001)
print(m,b)
if __name__ == '__main__':
run()
我得到的错误是:
linearRegression.py:22: RuntimeWarning: overflow encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
linearRegression.py:21: RuntimeWarning: invalid value encountered in double_scalars
b_graident +=(-2/N) * (y-(m*x+b))
linearRegression.py:22: RuntimeWarning: invalid value encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
如果有人能帮助我,我会非常感谢,因为我坚持了大约两个月,谢谢
编辑:tl;dr 解决方案
好的,这是我所说的最小可重现示例。我用以下内容替换你的 X,Y。
n = 10**2
X = np.linspace(0,10**6,n)
Y = 1.5*X+0.2*10**6*np.random.normal(size=n)
如果我那么运行
b=0
m=0
numberOfIttertions = 1000
m,b = graident_decsent(X , Y ,m,b,numberOfIttertions , 0.001)
我完全明白你描述的问题。唯一令人惊讶的是解决方案的简便性。我只是将您的 alpha 替换为 10**-14,一切正常。
为什么以及如何给出一个最小的、可重现的例子
您的示例无法重现,因为我们没有 train.csv
。通常,为了让您自己理解您的问题并获得具体的答案,提供一个非常小的示例供人们 运行 和修改它是 非常 很有帮助的。例如。也许你可以想到一个更短的回归输入,这也会导致这个错误。
第一个 RuntimeWarning
但是现在回答你的问题。你的第一个 RuntimeWarning
即
linearRegression.py:22: RuntimeWarning: overflow encountered in double_scalars
m_graident += (-2/N) * x*(y-(m*x+b))
表示 x
,因此 m_graident
是 numpy.double=numpy.float64
类型。此数据类型可以存储 (-1.79769313486e+308, 1.79769313486e+308).
范围内的数字,如果变大或变小,则称为溢出。例如。
np.double(1.79769313486e+308)
仍然可以,但是如果你将它乘以 1.1
你会得到你最喜欢的 运行 时间警告。请注意,这是 'just' 警告并且仍然是 运行s。但它不能给你一个数字,因为它太大了。相反,它会给你 inf
.
其他RuntimeWarnings
好的,但是什么
linearRegression.py:21: RuntimeWarning: invalid value encountered in double_scalars
b_graident +=(-2/N) * (y-(m*x+b))
是什么意思?
它来自于我刚才提到的无穷大计算。一些无穷大的计算是有效的。
np.inf-10**6 -> inf
np.inf+10**6 -> inf
np.inf/10**6 -> inf
np.inf*10**6 -> inf
np.inf*(-10**6) -> -inf
1/np.inf -> 0
np.inf *np.inf -> inf
但有些不是,给出 nan
即不是数字。
np.inf/np.inf
np.inf-np.inf
这些在数学中被称为不确定形式,因为它取决于你如何到达无穷大你会得到什么。例如
(np.double(1e+309)+np.double(1e+309))-np.double(1e+309)
np.double(1e+309)-(np.double(1e+309)+np.double(1e+309))
都是 inf-inf
,但您会期望得到不同的结果。
得到 nan
是不幸的,因为使用 nan
的计算结果总是 nan
。一旦添加了 nan
.
其他资源
另一种选择是使用现有的线性回归实现。例如。来自 scikit-learn
。参见