«Если вы не можете объяснить это просто, значит, вы недостаточно хорошо это понимаете».

Простая линейная регрессия - это статистический метод, который позволяет нам суммировать и изучать отношения между двумя непрерывными (количественными) переменными. Я надеюсь сегодня доказать себе, что я понимаю и могу продемонстрировать линейную регрессию, написав ее с нуля на Python без использования Scikit Learn.

Импортируйте библиотеки

Я начну с импорта библиотек - numpy и matplotlib. Я использую Anaconda, поэтому я буду использовать% matplotlib inline для отображения диаграмм в записной книжке.

Создайте данные

Я собираюсь создать свой собственный набор данных для этого примера, который намеренно настрою на линейную зависимость.

Я буду использовать numpy для создания двух массивов: X и y. Функция linspace будет возвращать числа с равными интервалами в течение указанного мной интервала. В скобках введите младшее число, старшее число и количество интервалов. Для этого я хочу

Я хочу добавить к этим массивам шум, поэтому создам переменную с помощью функции random.uniform numpy. Это вернет образец из равномерного распределения. В скобках введите нижнюю границу, верхнюю границу и форму вывода.

Постройте данные

Используйте matplotlib, чтобы построить базовую диаграмму рассеяния X и y.

Линия наилучшего соответствия

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

Я ясно вижу, что существует сильная положительная корреляция между двумя переменными - с увеличением X увеличивается и y. Я хочу математически доказать силу этой корреляции.

Уравнение прямой: y = mx + b, где m - наклон прямой, а b - y перехват

У меня уже есть значения X и y, поэтому теперь мне нужно вычислить m и b. Формулы для них можно записать как:

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

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

Теперь у меня есть знаменатель, я напишу числители m и b.

Числитель для m - это сумма X, умноженная на y (скалярное произведение X и y), за вычетом среднего значения y, умноженного на сумму X.

Числитель b - это среднее значение y, умноженное на сумму X в квадрате (скалярное произведение X), минус среднее значение X, умноженное на сумму X, умноженную на y (скалярное произведение X и y).

Теперь я могу вставить их в линейное уравнение, чтобы вычислить предсказанные значения y (линия наилучшего соответствия).

Теперь, используя matplotlib, я могу построить линию наилучшего соответствия.

Расчет R в квадрате

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

SSres: я начну с вычисления суммы остатков - евклидова расстояния между фактическими точками данных на оси y и их соответствующими прогнозируемыми значениями вдоль линии регрессии. Я возведу эти расстояния в квадрат; причина этого в том, что если у меня есть одно значение на пять единиц выше линии (+5) и еще на пять единиц ниже линии (-5), они будут нейтрализовать друг друга и создать впечатление, что данные ближе к строке что это на самом деле есть. Возведение этих расстояний в квадрат гарантирует, что все они являются положительными значениями.

SStot: затем я хочу вычислить расстояние между фактическими точками данных по оси y и средним значением y - снова возведя результат в квадрат.

Итак, формула для вычисления R в квадрате: 1 - SSres / SStot:

Я начну с создания переменных, которые вычисляют значения в скобках, а затем нахожу их скалярное произведение.

Затем я могу распечатать значение R в квадрате.

Итак, 91,5% изменения y можно объяснить с помощью X.

Надеюсь, вам это понравилось, а может быть, даже сочли полезным. Огромная заслуга принадлежит трем моим любимым преподавателям машинного обучения: Хосе Портилла, Ленивому программисту и Sentdex.