В этом руководстве вы можете узнать, как работает алгоритм градиентного спуска, и реализовать его с нуля с помощью Python. Сначала давайте посмотрим, что такое линейная регрессия, а затем определим функцию потерь. Мы узнаем, как работает алгоритм градиентного спуска, и, наконец, реализуем его на заданном наборе данных и сделаем прогнозы.
Значения m и c обновляются на каждой итерации для получения оптимального решенияЭта статьяэто видео, если вам больше нравится видео, смотрите его!
Линейная регрессия
В статистике линейная регрессия — это линейный метод моделирования взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. ПредполагатьXнезависимая переменная,Yявляется зависимой переменной. Мы определим линейную зависимость для этих двух переменных следующим образом:
Источник: http://www.nabla.hr/SlopeInterceptLineEqu.gifЭто уравнение прямой линии, которое вы выучили в старшей школе.mэто наклон,cявляется y-перехватом. Сегодня мы будем использовать это уравнение для обучения нашей модели с заданным набором данных и для любого заданногоXпрогнозировать соответствующиеY. Наша задача сегодня состоит в том, чтобы определитьmиcзначений, чтобы линия, соответствующая этим значениям, была линией наилучшего соответствия или ошибка была наименьшей.
функция потерь
потеря - это то, что мы предсказываемmиcошибка. Наша цель — минимизировать эту ошибку, чтобы получитьmиcсамое точное значение. Мы будем использовать функцию среднего квадрата ошибки для расчета потерь. Эта функция состоит из трех шагов:
- Для данного x найдите разницу между фактическим значением y и предсказанным значением y (y = mx + c).
- Сократите разницу.
- Все значения в X возводятся в квадрат, как указано выше, и вычисляется среднее значение.
здесьэто фактическое значение,является прогнозируемым значением. давайте заменимЗначение:
Другими словами, мы возводим ошибку в квадрат, а затем находим среднее значение, которое и является источником названия среднеквадратичной ошибки. Теперь, когда мы определили нашу функцию потерь, давайте перейдем к самой интересной части: ее минимизации и нахождению.mиc.
Градиентный спуск
Градиентный спуск — это итеративный алгоритм оптимизации, который находит минимальное значение функции. Здесь эта функция является нашей функцией потерь.
Понимание градиентного спуска
Представьте себе долину и кого-то, кто хочет добраться до дна долины, но не имеет чувства направления. Он спускался по склону, делая один большой шаг, когда склон был крутым, и маленький шаг, когда склон был не слишком крутым. Он определяет свою следующую позицию на основе своей текущей позиции и останавливается, когда достигает дна, что является его целью.
Попробуем применить градиентный спуск кmиc, и подойдите к нему шаг за шагом:
- Пусть изначально m = 0 и c = 0. Используйте L в качестве нашей скорости обучения, которая контролируетmМеняйте размер на каждом этапе. Для точности L можно установить на небольшое значение, например 0,0001.
- Вычислите частную производную функции потерь по m и подставьте текущие x, y, m и c, чтобы получить производнуюD.
правдаmЗначение частной производной . Снова найдем частную производную по c:
Производная по c- Теперь мы обновляем текущий с помощью следующего уравненияmиcЗначение:
- Мы повторяем этот процесс до тех пор, пока наша функция потерь не станет очень малым значением или, в идеале, 0 (что означает, что ошибка равна 0 или 100% точности). Что осталось от нас сейчасmиcЭто оптимальное значение.
Теперь вернемся к нашей аналогии,mМожет рассматриваться как текущее местоположение человека.Dэквивалентно наклону,Lэто скорость, с которой он движется. Теперь мы используем приведенное выше уравнение для расчетаmНовое значение будет его следующей позицией,размер его следующего шага. Когда склон круче (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()
# 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)
вывод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()
Градиентный спуск — один из самых простых и наиболее широко используемых алгоритмов машинного обучения, главным образом потому, что его можно применять к любой функции для ее оптимизации. Изучение этого закладывает основу для освоения машинного обучения.
Набор данных и код здесь: 02 Linear Regression using Gradient Descent