Машинное обучение с нуля: часть 3

В этой статье мы реализуем нормальное уравнение, которое является закрытым решением для алгоритма линейной регрессии, где мы можем найти оптимальное значение theta всего за один шаг без использования алгоритма градиентного спуска.

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

Серия "Машинное обучение с нуля" -





Резюме градиентного спуска

У нас есть,

  • X → Входные данные (данные обучения)
  • y → Целевая переменная
  • theta → Параметр
  • y_hat → Прогноз / гипотеза (скалярное произведение theta и X).

  • Функция потерь → потеря MSE или потеря среднеквадратичной ошибки (_9 _-_ 10_) ²

  • m → количество обучающих примеров.
  • n → количество функций

Алгоритм градиентного спуска -

Сначала мы инициализируем параметр theta случайным образом или всеми нулями. Потом,

  1. Рассчитайте прогноз / гипотезу y_hat, используя уравнение 1 выше.
  2. Затем используйте прогноз / гипотезу y_hat, чтобы рассчитать потерю MSE следующим образом - (_16 _-_ 17_) ².
  3. Затем возьмите частную производную (градиент) потерь MSE по параметру theta.
  4. Наконец, используйте эту частную производную (градиент), чтобы обновить параметр theta следующим образом - theta: = theta -_22 _ * _ 23_, где lr - скорость обучения.
  5. Повторите шаги с 1 по 4, пока не достигнете оптимального значения параметра theta.

Нормальное уравнение

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

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

Чтобы вычислить theta, мы берем частную производную функции потерь MSE (уравнение 2) по theta и устанавливаем ее равной нулю. Затем выполните немного линейной алгебры, чтобы получить значение theta.

Это нормальное уравнение -

Если вы знаете о производных матриц, а также о некоторых свойствах матриц, вы сможете вывести нормальное уравнение для себя.

Для справки - Вывод нормального уравнения линейной регрессии.

Вы можете подумать, что, если X - необратимая матрица, что обычно происходит, если у вас есть избыточные функции, то есть ваши функции линейно зависят, вероятно, потому, что у вас одни и те же функции повторяются дважды. Одна вещь, которую вы можете сделать, - это выяснить, какие функции повторяются, и исправить их, или вы можете использовать функцию np.pinv в NumPy, которая также даст вам правильный ответ.

Алгоритм

  1. Рассчитайте theta, используя нормальное уравнение.
  2. Используйте theta, чтобы делать прогнозы.

Проверьте формы X и y, чтобы уравнение совпало.

Нормальное уравнение в действии

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

import numpy as np
np.random.seed(42)
X = np.random.randn(500,1)
y = 2*X + 1 + 1.2*np.random.randn(500,1)
X.shape, y.shape
>>((500, 1), (500,))

Здесь n = 1, что означает, что матрица X имеет только 1 столбец, а m = 500 означает, что X имеет 500 строк. X - это матрица (500x1), а y - вектор длиной 500.

Найти тета-функцию

Давайте напишем код для вычисления теты с использованием нормального уравнения.

См. Комментарии (#).

def find_theta(X, y):
    
    m = X.shape[0] # Number of training examples. 
    # Appending a cloumn of ones in X to add the bias term.
    X = np.append(X, np.ones((m,1)), axis=1)    
    # reshaping y to (m,1)
    y = y.reshape(m,1)
    
    # The Normal Equation
    theta = np.dot(np.linalg.inv(np.dot(X.T, X)), np.dot(X.T, y))
    
    return theta

Функция прогноза

См. Комментарии (#).

def predict(X):
    
    # Appending a cloumn of ones in X to add the bias term.
    X = np.append(X, np.ones((X.shape[0],1)), axis=1)
    
    # preds is y_hat which is the dot product of X and theta.
    preds = np.dot(X, theta)
    
    return preds

Построение прогнозов

См. Комментарии (#).

# Getting the Value of theta using the find_theta function.
theta = find_theta(X, y)
theta
>>array([[1.90949642],
        [1.0388102 ]]
# Getting the predictions on X using the predict function.
preds = predict(X)
# Plotting the predictions.
fig = plt.figure(figsize=(8,6))
plt.plot(X, y, 'b.')
plt.plot(X, preds, 'c-')
plt.xlabel('X - Input')
plt.ylabel('y - target / true')

Голубая линия показывает прогнозы для всех значений X.

Мы нашли оптимальные значения theta всего за один шаг, и theta, которое мы нашли, является глобальным минимумом функции потерь MSE для заданных данных.

Когда использовать нормальное уравнение?

Если вы хотите использовать алгоритм линейной регрессии и именно линейной регрессии и,

  • Если n (количество функций) мало.
  • Если m (количество обучающих примеров) мало, то есть около 20000.

Нормальное уравнение - хороший алгоритм, который следует учитывать при построении модели машинного обучения.

По вопросам, комментариям, проблемам обращайтесь ко мне в разделе ответов. Скоро появятся новые статьи о машинном обучении с нуля.

Серия "Машинное обучение с нуля" -