线性回归输出 "inf" 值
Linear regression outputs "inf" value
我正在尝试学习线性回归,试一试这个问题。调整后的b(bias)和m(linear coefficient)的结果输出为“inf”或“-inf”,我该怎么办?
抱歉,如果代码中的问题很明显,我是新手。
from matplotlib import pyplot as plt
import random
x = [1,2,3,3,4,4,3,2,1,2,5,4]
y = [1,2,2,1,3,4,1,1,2,3,4,5]
b = random.random()
m = random.random()
learning_rate = 0.3
iterations = 1000
for i in range(iterations):
for k in range(len(x)):
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
如果我没猜错,你正在尝试使用梯度下降来解决线性回归
模型。以下是您的方法存在的问题:
第一个:
导数不正确,而不是
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
它应该是关于 m
和 b
的误差的导数。
第二个:
您不会在每次看到数据点 x[k]
时都更新梯度,就像您在代码的内部 for 循环中所做的那样:
for k in range(len(x)):
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
相反,您累积所有 x
的错误并取平均。使用平均误差更新 ypur m
和 n
.
第三名:
也许你的 learning_rate
设置为 0.3
太大了,以至于它 'overshoots' 是你每次更新的最佳点,因此 m
和 b
的值一直到 inf
.
也就是说,以下是我的解决方案,使用 error
函数来检查
每次迭代得到的平均错误。
def error(x,y, m, b):
error = 0
for k in range(len(x)):
error = error + ((x[k] * m + b - y[k]) **2)
return error
from matplotlib import pyplot as plt
import random
x = [1,2,3,3,4,4,3,2,1,2,5,4]
y = [1,2,2,1,3,4,1,1,2,3,4,5]
b = random.random()
m = random.random()
learning_rate = 0.01
iterations = 100
for i in range(iterations):
print(error(x, y, m, b))
d_m = 0
d_b = 0
for k in range(len(x)):
# Calulate the derivative w.r.t. m and accumulate the error
derivative_error_m = -2*(y[k] - m*x[k] - b)*x[k]
d_m = d_m + derivative_error_m
# Calulate the derivative w.r.t. b and accumulate the error
derirative_error_b = -2*(y[k] - m*x[k] - b)
d_b = d_b + derirative_error_b
# Average the derivate of errors.
d_m = d_m / len(x)
d_b = d_b / len(x)
# Update parameters to the negative direction of gradient.
m = m - d_m * learning_rate
b = b - d_b * learning_rate
在 运行 iterations = 10
的代码之后,您得到:
15.443121587504484
14.019097680461613
13.123926121402514
12.561191094860135
12.207425702911078
11.985018705759003
11.8451837105445
11.757253610772613
11.70195107555181
11.66715838203049
每次更新错误都在减少。
此外,您还应该注意到像线性回归这样的简单模型。有一个很好的封闭形式的解决方案,它可以立即为您提供最佳解决方案,而无需应用梯度下降等迭代。
我正在尝试学习线性回归,试一试这个问题。调整后的b(bias)和m(linear coefficient)的结果输出为“inf”或“-inf”,我该怎么办?
抱歉,如果代码中的问题很明显,我是新手。
from matplotlib import pyplot as plt
import random
x = [1,2,3,3,4,4,3,2,1,2,5,4]
y = [1,2,2,1,3,4,1,1,2,3,4,5]
b = random.random()
m = random.random()
learning_rate = 0.3
iterations = 1000
for i in range(iterations):
for k in range(len(x)):
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
如果我没猜错,你正在尝试使用梯度下降来解决线性回归 模型。以下是您的方法存在的问题:
第一个: 导数不正确,而不是
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
它应该是关于 m
和 b
的误差的导数。
第二个:
您不会在每次看到数据点 x[k]
时都更新梯度,就像您在代码的内部 for 循环中所做的那样:
for k in range(len(x)):
X = m * x[k] + b
derivative_error = 2 * (X - y[k])
dX_dm = x[k]
dX_db = 1
m += derivative_error * dX_dm * learning_rate
b += derivative_error * learning_rate
相反,您累积所有 x
的错误并取平均。使用平均误差更新 ypur m
和 n
.
第三名:
也许你的 learning_rate
设置为 0.3
太大了,以至于它 'overshoots' 是你每次更新的最佳点,因此 m
和 b
的值一直到 inf
.
也就是说,以下是我的解决方案,使用 error
函数来检查
每次迭代得到的平均错误。
def error(x,y, m, b):
error = 0
for k in range(len(x)):
error = error + ((x[k] * m + b - y[k]) **2)
return error
from matplotlib import pyplot as plt
import random
x = [1,2,3,3,4,4,3,2,1,2,5,4]
y = [1,2,2,1,3,4,1,1,2,3,4,5]
b = random.random()
m = random.random()
learning_rate = 0.01
iterations = 100
for i in range(iterations):
print(error(x, y, m, b))
d_m = 0
d_b = 0
for k in range(len(x)):
# Calulate the derivative w.r.t. m and accumulate the error
derivative_error_m = -2*(y[k] - m*x[k] - b)*x[k]
d_m = d_m + derivative_error_m
# Calulate the derivative w.r.t. b and accumulate the error
derirative_error_b = -2*(y[k] - m*x[k] - b)
d_b = d_b + derirative_error_b
# Average the derivate of errors.
d_m = d_m / len(x)
d_b = d_b / len(x)
# Update parameters to the negative direction of gradient.
m = m - d_m * learning_rate
b = b - d_b * learning_rate
在 运行 iterations = 10
的代码之后,您得到:
15.443121587504484
14.019097680461613
13.123926121402514
12.561191094860135
12.207425702911078
11.985018705759003
11.8451837105445
11.757253610772613
11.70195107555181
11.66715838203049
每次更新错误都在减少。
此外,您还应该注意到像线性回归这样的简单模型。有一个很好的封闭形式的解决方案,它可以立即为您提供最佳解决方案,而无需应用梯度下降等迭代。