Линейная регрессия градиентного спуска Pythong плохо вычисляется

#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. Отлично. Большое спасибо.