线性回归从无到有的实现

2024-04-25 01:09:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着理解梯度下降算法。你知道吗

有人能解释一下为什么我用下面的代码得到高MSE值,或者如果我遗漏了一些概念,你能澄清一下吗?你知道吗

import numpy as np
import pandas as pd

my_data = pd.DataFrame({'x': np.arange(0,100),
                       'y': np.arange(0,100)})
X = my_data.iloc[:,0:1].values
y = my_data.iloc[:,1].values

def gradientDescent(X, y, lr = 0.001, n = 1000):

    n_samples, n_features = X.shape
    cost = []
    weight = np.zeros([n_features])
    b = 0

    for _ in range(n):
        # predict
        y_hat = np.dot(X, weight) + b # y = ax + b

        residual =  y - y_hat
        db = -(2/n_samples) * np.sum(residual)
        dw = -(2/n_samples) * np.sum(X.T * residual, axis = 1)

        # update weights

        weight -= (lr * dw)
        b -= (lr * db)

        cost.append(((y-y_hat) **2).mean())

    return weight, b, cost

gradientDescent(X,y)

Tags: importdatamyhatasnppdvalues
1条回答
网友
1楼 · 发布于 2024-04-25 01:09:49

不是专家,但我认为您目前正遇到exploding gradient问题。如果您单步执行代码,您将注意到您的权重值在递增的步骤中从正变为负。我相信你找不到最小值,因为对这个数据集使用mse会导致你来回跳跃,永远不会收敛。你的x和y的范围是100,所以当你看成本时,它只是爆炸。你知道吗

如果要将mse与当前的x和y值一起使用,则应规范化数据。你可以用平均值减去标准差,或者把x和y都标准化为1。你知道吗

例如:

my_data.x = my_data.x.transform(lambda x: x / x.max())
my_data.y = my_data.y.transform(lambda x: x / x.max())

如果你这样做,你应该看到你的成本收敛到~0与足够的迭代。你知道吗

相关问题 更多 >