从头开始线性回归实现

问题描述 投票:0回答:1

我正在尝试了解梯度下降算法。

有人可以使用以下代码解释为什么我获得较高的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)
python linear-regression
1个回答
0
投票

不是专家,但我认为您当前遇到exploding gradient问题。如果您逐步执行代码,您会发现您的体重值正以递增的方式从正变到负。我相信您找不到最小值,因为对此数据集使用mse会导致您来回跳转而从未收敛。您的x和y范围为100,因此,当您查看成本时,它正在爆炸。

如果要在当前的x和y值中使用mse,则应规范化数据。您可以通过减去平均值并除以标准偏差来执行此操作,也可以将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。

© www.soinside.com 2019 - 2024. All rights reserved.