【问题标题】:Gradient Descent on Boston Dataset波士顿数据集上的梯度下降
【发布时间】:2020-05-24 18:00:23
【问题描述】:

我正在尝试从头开始实现梯度下降算法并将其用于波士顿数据集。这是我目前所拥有的:

import numpy as np
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error


dataset = load_boston()
X = dataset.data
y = dataset.targe

def gradient_descent(X, y, eta = 0.0001, n_iter = 1000):
    '''
    Gradient descent implementation
    eta: Learning Rate
    n_iter: Number of iteration
    '''
    b0 = b1 = 1
    costList = []
    m = len(y)
    for i in range(n_iter):
        error = y - (b0 + X*b1)
        #Updating b0 and b1
        b0 += -eta * (-2 * error.sum() / m )
        b1 += -eta * (-2 * X.dot(error).sum() / m )
        costList.append(mean_squared_error(y, (b0 + b1*X)))
    return costList


listt = gradient_descent(X, y)

但是,当我尝试计算 error 时收到以下错误:operands could not be broadcast together with shapes (506,) (506,13) 其中 y 的形状是 (506,) and shape of y_predict is (506, 13) I

出现这个错误是因为 y_predict 的维度是 2 而 y 是一维的。但是,我不知道如何克服这个问题。

GD 在我只使用整个数据集的一个特征时有效;但是,我想使用所有这些

【问题讨论】:

  • 这真的是导致您引用的错误消息的代码吗?一方面,您拼错了“目标”。另一方面,您的代码中没有名为“y_predict”的变量。

标签: numpy linear-regression gradient-descent


【解决方案1】:

您需要使用multivariate linear regression 而不是您使用的单变量线性回归,因为 X 连续有多个值。

所以,b1 应该是向量,而不是标量。

我刚刚将您的代码转换为多元线性回归。 但它很容易发散(b1 会很大)。所以,也许你应该考虑像ridge regression 这样的高级线性回归。

import numpy as np
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error


dataset = load_boston()
X = dataset.data
y = np.expand_dims(dataset.target,axis=1) # for maxtrix mul

#new_X = (X-X.mean())/X.std()

def gradient_descent(X, y, eta = 0.000001, n_iter = 1000):
    '''
    Gradient descent implementation
    eta: Learning Rate
    n_iter: Number of iteration
    '''
    b0 = 1
    b1 = np.ones((13,1)) # b1 should be vector
    costList = []
    m = len(y)
    for _ in range(n_iter):
        # error = y - (b0 + X.dot(b1)) # it is wrong
        error = (b0 + X.dot(b1)) - y

        #Updating b0 and b1
        b0 += -eta * (error.sum() / m )
        b1 += -eta * (X.T.dot(error) / m )
        costList.append(mean_squared_error(y, (b0 + X.dot(b1))))
    return costList


listt = gradient_descent(X, y, eta=10e-5,n_iter=10)

【讨论】:

  • 感谢您的信息。然而,这是错误的。我认为成本应该在这一轮中单调下降,但在这种情况下并非如此
  • @EmrahSariboz 我有关于错误迹象的错误。我刚刚修好了。而梯度下降法并不能保证收敛。所以“成本应该单调下降”可能不会发生。在这种情况下,我们需要尝试另一种技术。请查看new_X。将 X 替换为 new_X 使收敛更容易。
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2021-11-13
  • 2017-05-12
  • 2023-04-08
  • 2016-07-21
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多