[Перевод] Линейная регрессия с использованием градиентного спуска

машинное обучение

оригинал:Linear Regression using Gradient Descent

В этом руководстве вы можете узнать, как работает алгоритм градиентного спуска, и реализовать его с нуля с помощью Python. Сначала давайте посмотрим, что такое линейная регрессия, а затем определим функцию потерь. Мы узнаем, как работает алгоритм градиентного спуска, и, наконец, реализуем его на заданном наборе данных и сделаем прогнозы.

Значения m и c обновляются на каждой итерации для получения оптимального решения

Эта статьяэто видео, если вам больше нравится видео, смотрите его!

Линейная регрессия

В статистике линейная регрессия — это линейный метод моделирования взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. ПредполагатьXнезависимая переменная,Yявляется зависимой переменной. Мы определим линейную зависимость для этих двух переменных следующим образом:

Источник: http://www.nabla.hr/SlopeInterceptLineEqu.gif

Это уравнение прямой линии, которое вы выучили в старшей школе.mэто наклон,cявляется y-перехватом. Сегодня мы будем использовать это уравнение для обучения нашей модели с заданным набором данных и для любого заданногоXпрогнозировать соответствующиеY. Наша задача сегодня состоит в том, чтобы определитьmиcзначений, чтобы линия, соответствующая этим значениям, была линией наилучшего соответствия или ошибка была наименьшей.

функция потерь

потеря - это то, что мы предсказываемmиcошибка. Наша цель — минимизировать эту ошибку, чтобы получитьmиcсамое точное значение. Мы будем использовать функцию среднего квадрата ошибки для расчета потерь. Эта функция состоит из трех шагов:

  1. Для данного x найдите разницу между фактическим значением y и предсказанным значением y (y = mx + c).
  2. Сократите разницу.
  3. Все значения в X возводятся в квадрат, как указано выше, и вычисляется среднее значение.

функция среднеквадратичной ошибки

здесьy_iэто фактическое значение,\bar{y_i}является прогнозируемым значением. давайте заменим\bar{y_i}Значение:

Другими словами, мы возводим ошибку в квадрат, а затем находим среднее значение, которое и является источником названия среднеквадратичной ошибки. Теперь, когда мы определили нашу функцию потерь, давайте перейдем к самой интересной части: ее минимизации и нахождению.mиc.

Градиентный спуск

Градиентный спуск — это итеративный алгоритм оптимизации, который находит минимальное значение функции. Здесь эта функция является нашей функцией потерь.

Понимание градиентного спуска

Представьте себе долину и кого-то, кто хочет добраться до дна долины, но не имеет чувства направления. Он спускался по склону, делая один большой шаг, когда склон был крутым, и маленький шаг, когда склон был не слишком крутым. Он определяет свою следующую позицию на основе своей текущей позиции и останавливается, когда достигает дна, что является его целью.

Попробуем применить градиентный спуск кmиc, и подойдите к нему шаг за шагом:

  1. Пусть изначально m = 0 и c = 0. Используйте L в качестве нашей скорости обучения, которая контролируетmМеняйте размер на каждом этапе. Для точности L можно установить на небольшое значение, например 0,0001.
  2. Вычислите частную производную функции потерь по m и подставьте текущие x, y, m и c, чтобы получить производнуюD.

Производная по m

D_mправдаmЗначение частной производной . Снова найдем частную производную по cD_c:

Производная по c
  1. Теперь мы обновляем текущий с помощью следующего уравненияmиcЗначение:

  1. Мы повторяем этот процесс до тех пор, пока наша функция потерь не станет очень малым значением или, в идеале, 0 (что означает, что ошибка равна 0 или 100% точности). Что осталось от нас сейчасmиcЭто оптимальное значение.

Теперь вернемся к нашей аналогии,mМожет рассматриваться как текущее местоположение человека.Dэквивалентно наклону,Lэто скорость, с которой он движется. Теперь мы используем приведенное выше уравнение для расчетаmНовое значение будет его следующей позицией,L×Dразмер его следующего шага. Когда склон круче (Dвыше), он делает более длинный шаг; когда наклон ниже (Dменьше), он делает более короткий шаг. Наконец он достигает дна, что соответствует нашему убытку = 0.

теперь естьmиc, наша модель может делать прогнозы!

Реализовать модель

Теперь давайте преобразуем все вышеперечисленное в код и посмотрим на нашу модель в действии!

# Making the imports
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (12.0, 9.0)

# Preprocessing Input data
data = pd.read_csv('data.csv')
X = data.iloc[:, 0]
Y = data.iloc[:, 1]
plt.scatter(X, Y)
plt.show()

linear_regression_gd1.py

# Building the model
m = 0
c = 0

L = 0.0001  # The learning Rate
epochs = 1000  # The number of iterations to perform gradient descent

n = float(len(X)) # Number of elements in X

# Performing Gradient Descent 
for i in range(epochs): 
    Y_pred = m*X + c  # The current predicted value of Y
    D_m = (-2/n) * sum(X * (Y - Y_pred))  # Derivative wrt m
    D_c = (-2/n) * sum(Y - Y_pred)  # Derivative wrt c
    m = m - L * D_m  # Update m
    c = c - L * D_c  # Update c
    
print (m, c)

linear_regression_gd2.py

вывод1.4796491688889395 0.10148121494753726

# Making predictions
Y_pred = m*X + c

plt.scatter(X, Y) 
plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='red')  # regression line
plt.show()

linear_regression_gd3.py

Градиентный спуск — один из самых простых и наиболее широко используемых алгоритмов машинного обучения, главным образом потому, что его можно применять к любой функции для ее оптимизации. Изучение этого закладывает основу для освоения машинного обучения.

Набор данных и код здесь: 02 Linear Regression using Gradient Descent