#python #machine-learning #gradient-descent
#python #машинное обучение #градиентный спуск
Вопрос:
Я начал изучать ML после курса Эндрю НГ на coursera. Я пытаюсь реализовать gradient descent with linear regression
, но я не уверен, чего мне не хватает. В соответствии с этим
Я пытался это реализовать, но что-то не так. Вот код. Стоит отметить, что я впервые прикасаюсь к python, не изучая основы.
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
x = [1,2,3,4,5]
y = [1,2,3,4,5]
def Gradient_Descent(x, y, learning_rate, iterations):
theta_1=np.random.randint(low=2, high=5);
theta_0=np.random.randint(low=2, high=5);
m = x.shape[0]
def mean_error(a, b, factor):
sum_mean = 0
for i in range(m):
sum_mean = (theta_0 theta_1 * a[i]) - b[i] # h(x) = (theta0 theta1 * x) - y
if factor:
sum_mean *= a[i]
return sum_mean
def perform_cal(theta_0, theta_1, m):
temp_0 = theta_0 - learning_rate * ((1 / m) * mean_error(x, y, False))
temp_1 = theta_1 - learning_rate * ((1 / m) * mean_error(x, y, True))
return temp_0 , temp_1
fig = plt.figure()
ax = fig.add_subplot(111)
for i in range(iterations):
theta_0, theta_1 = perform_cal(theta_0, theta_1, m)
ax.clear()
ax.plot(x, y, linestyle='None', marker='o')
ax.plot(x, theta_0 theta_1*x)
fig.canvas.draw()
x = np.array(x)
y = np.array(y)
Gradient_Descent(x,y, 0.1, 500)
input("Press enter to close program")
Что я делаю не так?
Ответ №1:
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
x = [1,2,3,4,5]
y = [1,2,3,4,5]
def Gradient_Descent(x, y, learning_rate, iterations):
theta_1=0
theta_0=0
m = x.shape[0]
for i in range(iterations):
theta_0, theta_1 = perform_cal(theta_0, theta_1, m, learning_rate)
ax.clear()
ax.plot(x, y, linestyle='None', marker='o')
ax.plot(x, theta_0 theta_1*x)
fig.canvas.draw()
def mean_error(a, b, factor, m, theta_0, theta_1):
sum_mean = 0
for i in range(m):
sum_mean = (theta_0 theta_1 * a[i]) - b[i] # h(x) = (theta0 theta1 * x) - y
if factor:
sum_mean *= a[i]
print(sum_mean)
return sum_mean
def perform_cal(theta_0, theta_1, m, learning_rate):
temp_0 = theta_0 - learning_rate * ((1 / m) * mean_error(x, y, False, m, theta_0, theta_1))
temp_1 = theta_1 - learning_rate * ((1 / m) * mean_error(x, y, True, m, theta_0, theta_1))
return temp_0 , temp_1
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.array(x)
y = np.array(y)
Gradient_Descent(x,y, 0.01, 100)
Внес некоторые изменения в ваш код (в основном переставил несколько строк и ничего не изменил из того, что вы сделали, чтобы это не казалось запутанным), и теперь он работает. Я бы посоветовал вам сначала изучить основы языка, так как большинство ошибок были довольно простыми, такими как передача параметров и т.д. Тем не менее, похвально, что вы пробуете что-то самостоятельно, внедряясь в курс Эндрю Нга.
Комментарии:
1. Спасибо! Аргументы были в порядке, понял, что проблема в том, как я скопировал код, и я потратил ваше время на рефакторинг.
mean_error
иperform_cal
являются локальными функциями внутриGradient_Descent
. Проблема заключалась в начальных значенияхtheta_0
иtheta_1
, а также в скорости обучения. Меняя их, как в вашем коде, все работает!2. Отлично! Как можно было бы сказать, они (скорость обучения, инициализация веса, настройка гиперпараметров в целом) являются наиболее важной частью при обучении любой модели ML, поскольку они решают, будет ли модель сходиться в любое возможное время (или сходиться вообще)… так что удачи!
3. И последнее, как я вижу, ты хорош в МЛ. Кажется, я не могу найти способ / формулу для прогнозирования значения, а не части набора данных. Мое предположение было бы (если мы возьмем мой код) сохранить последнюю
theta_0
theta_1
версию и просто использовать функцию гипотезы для возврата прогнозируемого значения. В таком случаеtheta_0 theta_1 * XToPredict
этого достаточно?4. Да, ваше предположение верно. Цель нашего алгоритма оптимизации (
gradient descent
в вашем случае) — найти наилучший набор параметров (theta_0
иtheta_1
в вашем случае), который дает наименьшие затраты (MSE
в вашем случае). Итак, как вы уже сказали, вам просто нужно взять эти оптимизированные параметры после завершения обучения и использовать уравнение строки (theta_0 theta_1 * XToPredict
) для получения прогноза.5. Отлично. Большое спасибо.