Градиентный спуск по Бостонскому набору данных - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь реализовать алгоритм градиентного спуска с нуля и использовать его в наборе данных Бостона. Вот что у меня есть:

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, а у - одномерная. Однако я не знаю, как решить эту проблему.

GD работает, когда я использую только одну особенность всего набора данных; однако я хочу использовать их все

1 Ответ

0 голосов
/ 09 февраля 2020

Вам нужно использовать многомерную линейную регрессию вместо использованной вами одномерной линейной регрессии, поскольку X имеет несколько значений подряд.

Итак, b1 должен быть векторным, а не скалярным.

Я только что преобразовал ваш код в многомерную линейную регрессию. Но он легко расходится ( b1 будет очень большим). Так что, возможно, вам следует рассмотреть продвинутую линейную регрессию, такую ​​как регрессия гребня .

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...