Одномерная линейная регрессия python

Линейная регрессия. Разбор математики и реализации на python

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

Линейная регрессия представляется из себя регриссионную модель зависимости одной (объясняемой, зависимой) переменной от другой или нескольких других переменных (фактров, регрессоров, независимых переменных) с линейной функцией зависимости. Рассмотрим модель линейной регрессии, при которой зависимая переменная зависит лишь от одного фактора, тогда функция, описывающуя зависимость y от x будет иметь следующий вид:

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

или подставив уравнение модели

Минимизируем функцию ошибки MSE найдя частные производные по w0 и w1

И приравняв их к нулю получим систему уравнений, решение которой обеспечит минимизацию функции потерь MSE.

Раскроем сумму и с учетом того, что -2/n не может равняться нулю, приравняем к нулю вторые множители

Выразим w0 из первого уравнения

Подставив во второе уравнение решим относительно w1

И выразив w1 последнего уравнения получим

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

Для вычисления интерсепта (коэффициента w0) необходимо к таблице добавить столбец слева с фактором f0 все значения которого равны 1 (единичный вектор-столбец). И тогда столбцы f0-f3 (по количеству столбцов не ограничены, можно считать fn) можно выделить в матрицу X, целевую переменную в матрицу-столбец y, а искомые коэффициенты можно представить в виде вектора w.

можно представить в следующем виде

Представим в виде скалярного произведения < >и вычислим производную используя дифференциал

приведем формулу к следующему виду

Поскольку дифференциал разницы равен разнице дифференциалов, дифференциал константы (y) равен нулю и константу (в данном случае матрицу X) можно вынести за знак дифференциала, получим

Используя свойство скалярного произведения перенесем матрицу X справа налево незабыв транспонировать ее

Собственно, то что слева и есть дифференциал, найдем экстремум приравняв его к нулю и решив по параметрам w

раскроем скобки и перенесем значения без w вправо

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

Аналитическое решение получено, переходим к реализации на python.

#импорт необходимых библиотек import numpy as np from sklearn.linear_model import LinearRegression #зададим начальные условия f0 = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) f1 = np.array([1.1, 2.1, 3.1, 4.4, 5.2, 6.4, 7.1, 8.2, 9.4, 10.5]) f2 = np.array([1.4, 2.3, 3.4, 4.1, 5.5, 6.2, 7.3, 8.4, 9.2, 10.1]) f3 = np.array([1.2, 2.2, 3.4, 4.2, 5.3, 6.2, 7.3, 8.4, 9.2, 10.3]) y = np.array([[1.2], [2.2], [3.3], [4.3], [5.2], [6.3], [7.2], [8.3], [9.3], [10.2]]) w = np.array([np.nan, np.nan, np.nan, np.nan]) X = np.array([f0, f1, f2, f3]).T #рассчитаем коэффициенты используя выведенную формулу coef_matrix = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X)), X.T), y) print(f'Коэффициенты рассчитанные по формуле ') #Коэффициенты рассчитанные по формуле [0.05994939 0.42839296 0.09249473 0.46642055] #проверим расчет используя библиотеку sklearn model = LinearRegression().fit(X, y) coef_sklearn = model.coef_.T coef_sklearn[0] = model.intercept_ print(f'Коэффициенты рассчитанные с использованием библиотеки sklearn ') #Коэффициенты полученные с рассчитанные библиотеки sklearn [0.05994939 0.42839296 0.09249473 0.46642055]

Надеюсь эта статья помогла заглянуть под капот одного из базовых методов машинного обучения — линейной регрессии и станет первой ступенью в этот увлекательный мир: математика машинного обучения.

Источник

Одномерная линейная регрессия в Python — Различные подходы

Цель этой статьи — продемонстрировать различные подходы, которые мы можем использовать для построения одномерной линейной регрессии в python. Мы увидим формулы, используемые для каждого подхода, и сравним их предсказания.

Введение

Линейная регрессия — это алгоритмический метод поиска линейной зависимости между предиктором (независимым) и целевыми (зависимыми) переменными (т. е. x и y). Модель LR пытается соответствовать линии, которая определяет отношение между x и y.

Линейная регрессия с одним предиктором или независимой переменной называется одномерной линейной регрессией

Общее уравнение линейной регрессии:

Есть два способа найти эту связь.

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

Есть два способа представить нормальную форму уравнения

а. Матричная форма

б. Форма ковариации/дисперсии

Для задач одномерной регрессии m равно 1 (т.е. m=1)

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

Любой вариант алгоритма градиентного спуска может быть использован для минимизации функции стоимости LR.

Подготовка данных

import pandas as pd import numpy as np import matplotlib.pyplot as plt import pathlib path = pathlib.Path.cwd()/’input’ data = pd.read_csv(f’/ex1data1.txt’, names=[‘population’,’profit’]) data.head()

Преобразование переменных X и Y в массивы numpy (матрицы/векторы), а также добавление столбца 1 к X (поскольку значение X0 равно 1 в w0. x0, т.е. предполагается, что коэффициент перехвата равен 1)

X = np.column_stack([np.ones(len(data), dtype=np.float32),data['population'].values]) y = data['profit'].values

Матричная форма

Intercept: -3.895780878311868 Slope:1.1930336441895961 Profit Prediction for 6110.1 is 33937.73991050984 R Squared: 0.70203155378414 Adj. R-Squared: 0.6988950438239729 Std.Error: 3.023647930875245 F Static: 223.8257052264462 MeanAbsPercErr. : 2.194245398827008

Использование OLS в StatsModel

Использование Scikit-Learn

explained Var.: 0.7020315537841397 R Square: 0.7020315537841397 Mean Abs Error:2.194245398827005 Mean Squared Error:8.953942751950358

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

theta: [-3.89577557 1.19303311] | cost: 4.476971375977743 | iteration: 15000

Ковариация и дисперсия

Intercept: -3.8957808783118653 Coefficient: 1.1930336441895943

Вывод

Как мы видели, все подходы линейной регрессии для прогнозирования абсолютно одинаковы (с полным кодом, доступным @ ядро Kaggle), и я оставляю профилирование подходов (кодов), чтобы найти оптимизированный подход для будущих целей. Другие сообщения из этой серии с использованием R и Pyspark

[Обновлен пост с вставками кода]

Источник

Читайте также:  React class constructor typescript
Оцените статью