Реализация градиентного спуска в python? - PullRequest
2 голосов
/ 17 марта 2019

Я пытался реализовать градиентный спуск, и он работал правильно, когда я тестировал его на примере набора данных, но он не работает должным образом для набора данных Бостона.

Можете ли вы проверить, что не так с кодом.почему я не получаю правильный тета-вектор?

import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

X = load_boston().data
y = load_boston().target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train1 = np.c_[np.ones((len(X_train), 1)), X_train]
X_test1 = np.c_[np.ones((len(X_test), 1)), X_test]

eta = 0.0001
n_iterations = 100
m = len(X_train1)
tol = 0.00001

theta = np.random.randn(14, 1)

for i in range(n_iterations):
    gradients = 2/m * X_train1.T.dot(X_train1.dot(theta) - y_train)
    if np.linalg.norm(X_train1) < tol:
        break
    theta = theta - (eta * gradients)

Я получаю свой весовой вектор в форме (14, 354).Что я тут не так делаю?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

y_train - это одномерный массив NP (ndim = 1), тогда как X_train1.dot (theta) - это двумерный массив NP (ndim = 2). Когда вы делаете вычитание, y_train транслируется в то же измерение, что и другое. Для решения этой проблемы вы можете также преобразовать y_train в двумерный массив. Вы можете сделать это с помощью y_train.reshape (-1,1).

for i in range(n_iterations):
gradients = 2/m * X_train1.T.dot(X_train1.dot(theta) - y_train.reshape(-1,1))
if np.linalg.norm(X_train1) < tol:
    break
theta = theta - (eta * gradients)
1 голос
/ 18 марта 2019

Учтите это (развернули некоторые операторы для лучшей наглядности):

for i in range(n_iterations):
    y_hat = X_train1.dot(theta)
    error = y_hat - y_train[:, None]
    gradients = 2/m * X_train1.T.dot(error)

    if np.linalg.norm(X_train1) < tol:
        break
    theta = theta - (eta * gradients)

, поскольку y_hat - (n_samples, 1) и y_train - (n_samples,) - для вашего примера n_samples - 354 - вам нужно привести y_train к тому же измерению с помощью трюка с фиктивной осью y_train[:, None].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...