Линейная регрессия, вероятно, является одним из самых простых, но невероятно мощных алгоритмов машинного обучения, которые используются сегодня. Как следует из названия, мы используем этот алгоритм для решения задач регрессии, где «цель», которую мы пытаемся смоделировать в нашем алгоритме обучения для прогнозирования, принимает непрерывные значения.

Как и другие контролируемые алгоритмы машинного обучения, линейная регрессия следует тому же процессу, когда мы вводим в наш алгоритм обучения набор обучающих примеров, содержащих набор функций , традиционно обозначаемые как « и results, обозначаемые «y». Алгоритм «учится» на этих примерах и генерирует модель или гипотезу, которая при правильном обучении в идеале должна уметь делать точные прогнозы на основе невидимых данных.

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

Философия и математика

Ниже приведен снимок нашего набора данных по жилью.

| Area (Square Feet) | Number of Rooms | Price ($)  |
| ------------------ | --------------- | ---------- |
| 2104               | 3               | 399900     |
| 1600               | 3               | 329900     |
| 4478               | 5               | 699900     |

На основе данных обучения мы наблюдаем 2 функции, Площадь и Количество комнат, а также результат цена, связанная с этим. Во всем наборе данных их 47 экземпляров. Цель здесь состоит в том, чтобы усилить 2 функции и их соответствующие результаты, которые мы получили из 47 примеров, чтобы построить предсказатель, который может эффективно «угадать» цену дома, если нам предоставят вышеупомянутые функции для «нового дома». этого нет в этом наборе данных.

В X мы будем хранить наши функции, а в y - их соответствующие цены. Это оставляет нам следующие матрицы:

Наша цель - создать функцию, которая может отображать X в y, например:

Мы определяем нашу «аппроксимирующую функцию» или «гипотезу» с помощью линейного уравнения следующим образом:

В приведенном выше уравнении, 1.3, мы ввели новый набор терминов θ₀, θ₁ и θ₂. Чтобы выполнить гипотезу, как определено в 1.2, нам нужно настроить θ₀, θ₁ и θ₂ так, чтобы они наилучшим образом соответствовали уравнению. Эти термины θ обычно называют «весами» или «параметрами», и, как и X и y, мы сохраняем их в матрице следующим образом:

Наше линейное уравнение в 1.3 можно переписать как матричное скалярное произведение X и Θ, но мы сталкиваемся с несоответствием размерностей; X имеет m строк и n столбцов, тогда как Θ - вектор-строка с (n + 1) столбцами. Чтобы преодолеть это несоответствие размерностей и учесть нулевой член θ₀, мы «дополняем» X дополнительным столбцом с единицами. По сути, все, что мы делаем, это:

Теперь может возникнуть вопрос, почему мы проходим через все эти трудности, чтобы приспособить θ₀? Почему мы не можем полностью отказаться от этого термина?
Чтобы ответить на этот вопрос, вспомните уравнение линии:

Приведенное выше уравнение в 1.6 состоит из двух компонентов: m наклона и c точки пересечения. Значение m определяет градиент линии, а c определяет точку, в которой линия пересекает ось y. Исходя из нашего уравнения в 1.3, мы, по сути, пытаемся добиться того же; Настройте θ₁ и θ₂, чтобы управлять градиентами по элементам X₁ и X₂. И настройте θ₀, который аналогичен c, чтобы найти идеальное значение точки пересечения, которое наилучшим образом соответствует нашим данным. После наших манипуляций с X мы переписываем 1.3 следующим образом:

И поскольку X₀ всегда 1, θ₀X₀ по существу θ₀. Теперь, когда у нас есть согласованные размеры X и Θ, мы переписываем 1.7 как следующую матричную операцию:

Теперь, когда у нас есть наша гипотеза, пора использовать ее, чтобы настроить Θ для сопоставления с y. Напомним из 1.2, мы хотим, чтобы эта гипотеза f̂ (X) была как можно ближе к y насколько это возможно. Хотя мы знаем, как настраивать наши веса, Θ необходимо для достижения этого приближения к y, нам нужна некоторая метрика производительности, чтобы определить, насколько далеко от конкретного экземпляр значений Θ из этого. Проще говоря, все, что мы пытаемся сделать, это:

Следовательно, мы определяем «функцию потерь», которая дает нам «оценку» того, насколько хорошо или плохо конкретный экземпляр значений Θ работал с приблизьтесь к y. Наиболее часто используемая функция потерь - это среднеквадратичная ошибка (MSE). И это то, что мы будем использовать для определения нашей функции потерь. Все MSE - это сумма всех индивидуальных квадратных расстояний между гипотезой и соответствующими результатами. Следующее уравнение обозначает MSE, обозначенное J:

Важно понимать, что наша функция потерь параметризуется значением наших весов, Θ. Другими словами, изменение Θ изменяет J (Θ). Как было сказано ранее, приведенное выше уравнение 1.11 представляет собой не что иное, как сумму квадратов расстояний между y и f̂ (X). . Учитывая это, мы можем определить «Матрицу дизайна» следующим образом:

Подставив 1,8 в приведенное выше уравнение, 1,12, мы получим следующее:

И если подставить полученную выше Матрицу проектирования, 1.13 в потерянную функцию из 1.11, мы получим:

Имея нашу функцию потерь, мы можем теперь упростить приведенное выше уравнение следующим образом:

В приведенном выше уравнении 1.15 обратите внимание на второй и третий члены; оба члена производят скаляры.

И поскольку отдельные компоненты обоих терминов одинаковы, они, по сути, дают одинаковый результат. Следовательно, мы можем еще больше упростить нашу функцию потерь:

Имея упрощенную функцию потерь 1.17 и поставив перед собой цель максимально сократить эти «потери» по сравнению с 1.9, мы можем теперь сделать следующий шаг к поиску экземпляр Θ такой, что J (Θ) становится минимальным. Мы делаем это, вычисляя производную нашей функции потерь относительно Θ.

Начиная с первого семестра:

Для второго члена мы сначала вычеркиваем термины, отличные от Θ:

А затем дифференцируйте:

Наконец, у нас остается последний член, и, как и в случае со вторым, мы сначала исключаем термины, не входящие в:

При вычислении производной от которой получаем:

Подставляя производные каждого термина обратно в 1.18, мы получаем:

Теперь, когда у нас есть первая производная нашей функции потерь, мы устанавливаем ее в 0, чтобы вычислить ее минимумы:

После избавления от констант остается:

Затем мы сдвигаем первый член в правую часть уравнения следующим образом:

Наконец, учитывая, что мы пытаемся вычислить Θ, мы сдвигаем все остальные члены также в правую часть, в результате чего получаем:

Нормальное уравнение!
Таким образом, значение Θ, которое мы получаем из приведенного выше уравнения, 1,28, дает нам ЭТО экземпляр Θ, где потери для нашей функции потерь , J (Θ) из 1.11 является минимальным. Полученное значение можно вставить в функцию гипотезы, которую мы сформулировали еще в 1.8. Который был:

Визуализация Θ

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

На графике ниже, 1.31 ниже, у нас есть 3 разные линии, где Θ установлено на 3 разных значения. Здравый смысл подсказывает, что зеленая линия лучше всего соответствует данным из трех. Черно-синие линии явно кажутся не совсем правильными.

Вспомните функцию стоимости из 1.11:

Ниже, в 1.33, представляет собой визуализацию различных значений веса Θ в интервале от -70 до 400 в сравнении с их соответствующими затратами, J (Θ). Также «x» отмечены потери в указанных выше строках для соответствующих значений Θ.

Из визуализаций в 1.31 и 1.33 видно, что линия, которая кажется наиболее подходящей (выделена зеленым цветом), принимает значение Θ, для чего она стоит, J (Θ) более или менее по крайней мере.
И Нормальное уравнение помогает вычислить это конкретное значение Θ.

Улов

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

Ошибка, с которой столкнулись при использовании нормального уравнения в реальных наборах данных, связана с необходимостью вычисления обратной матрицы, что требует больших вычислительных затрат. Сложность обращения матрицы составляет O (); Это означает, что по мере увеличения количества функций в нашем наборе данных сложность инвертирования Матрицы возрастает в кубическом масштабе! Таким образом, хотя нормальное уравнение отлично подходит для работы с небольшими наборами данных с относительно меньшим количеством функций, работа с реальными наборами данных может занять до неприличия много времени.

Вы можете найти мою реализацию Нормальных уравнений в Блокноте.