Градиентный спуск Python не сходится - PullRequest
0 голосов
/ 06 ноября 2018

Итак, я новичок в машинном обучении и пытаюсь реализовать градиентный спуск. Мой код кажется правильным (я думаю), но он не сходится к глобальному оптимуму.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def AddOnes(matrix):
    one = np.ones((matrix.shape[0], 1))
    X_bar = np.concatenate((one, matrix), axis=1)
    return X_bar


# Load data
df = pd.read_excel("Book1.xlsx", header=3)
X = np.array([df['Height']]).T
y = np.array([df['Weight']]).T

m = X.shape[0]
n = X.shape[1]
iterations = 30

# Build X_bar
X = AddOnes(X)

# Gradient descent
alpha = 0.00003
w = np.ones((n+1,1))
for i in range(iterations):
    h = np.dot(X, w)
    w -= alpha/m * np.dot(X.T, h-y)

print(w)

x0 = np.array([np.linspace(145, 185, 2)]).T
x0 = AddOnes(x0)
y0 = np.dot(x0, w)
x0 = np.linspace(145, 185, 2)

# Visualizing
plt.plot(X, y, 'ro')
plt.plot(x0, y0)
plt.axis([140, 190, 40, 80])
plt.xlabel("Height(cm)")
plt.ylabel("Weight(kg)")
plt.show()

Визуализация данных

1 Ответ

0 голосов
/ 11 ноября 2018

Вы используете линейную регрессию с одним нейроном, один нейрон может изучать только прямую линию независимо от того, какой набор данных вы предоставляете, где W действует как наклон, ваша сеть выучила оптимальный W для вашего X, так что WX дает минимальную ошибку ,

Диаграмма разброса (красная точка) выходных данных показывает значения вашего набора данных, вы можете заметить, что набор данных не является линейным, поэтому, даже если вы тренируетесь 1M раз, алгоритм никогда не сойдется. Но выученная функция наверняка оптимальна, так как это прямая линия с минимальной ошибкой.

Итак, я рекомендовал вам использовать несколько слоев с нелинейными активациями, такими как ReLu и Sigmoid. Используйте линейную активацию на выходе, поскольку вы предсказываете действительное число.

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