线性回归输出 "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

它应该是关于 mb 的误差的导数。

第二个: 您不会在每次看到数据点 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 mn.

第三名: 也许你的 learning_rate 设置为 0.3 太大了,以至于它 'overshoots' 是你每次更新的最佳点,因此 mb 的值一直到 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

每次更新错误都在减少。

此外,您还应该注意到像线性回归这样的简单模型。有一个很好的封闭形式的解决方案,它可以立即为您提供最佳解决方案,而无需应用梯度下降等迭代。