Линейная регрессия — различия между версиями
Zem4ik (обсуждение | вклад) (→Дано) |
м (rollbackEdits.php mass rollback) |
||
(не показана 21 промежуточная версия 7 участников) | |||
Строка 5: | Строка 5: | ||
==== Дано ==== | ==== Дано ==== | ||
− | * <tex> f_1(x), \dots ,f_n(x) </tex> | + | * <tex> f_1(x), \dots ,f_n(x) </tex> — числовые признаки; |
− | * модель многомерной линейной регрессии: <br> <tex> f(x,\alpha) = \sum\limits_{j=1}^n \alpha_j f_j(x) </tex>, <br> где <tex> a \in R^n </tex> | + | * модель многомерной линейной регрессии: <br> <tex> f(x,\alpha) = \sum\limits_{j=1}^n \alpha_j f_j(x) </tex>, <br> где <tex> a \in R^n </tex>; |
− | * обучающая выборка: множество из пар <tex>(x_i, y_i)_{i=1 \dots n}</tex> | + | * обучающая выборка: множество из пар <tex>(x_i, y_i)_{i=1 \dots n}</tex>; |
− | * <tex> x_i </tex> | + | * <tex> x_i </tex> — объекты из множества <tex> X = R^n </tex>; |
− | * <tex> y_i </tex> | + | * <tex> y_i </tex> — объекты из множества <tex> X = R </tex>. |
==== Матричные обозначения ==== | ==== Матричные обозначения ==== | ||
Строка 20: | Строка 20: | ||
f_1(x_1) & \dots & f_n(x_1) \\ | f_1(x_1) & \dots & f_n(x_1) \\ | ||
\dots & \dots & \dots \\ | \dots & \dots & \dots \\ | ||
− | + | f_1(x_l) & \dots & f_n(x_l) | |
\end{pmatrix} | \end{pmatrix} | ||
, | , | ||
Строка 35: | Строка 35: | ||
\alpha_1 \\ | \alpha_1 \\ | ||
\dots \\ | \dots \\ | ||
− | \ | + | \alpha_n |
\end{pmatrix} | \end{pmatrix} | ||
+ | </tex>, | ||
− | + | где | |
− | + | * <tex> F </tex> — матрица объектов-признаков, где строки соответствуют объектам а столбцы — признакам; | |
− | + | * <tex> y </tex> — вектор ответов, или целевой вектор; | |
− | * <tex> F </tex> | + | * <tex> \alpha </tex> — вектор коэффициентов. |
− | * <tex> y </tex> | ||
− | * <tex> \alpha </tex> | ||
==== Постановка задачи ==== | ==== Постановка задачи ==== | ||
Строка 50: | Строка 49: | ||
В этих трех векторно-матричных обозначениях очень удобно расписать постановку задачи наименьших квадратов: | В этих трех векторно-матричных обозначениях очень удобно расписать постановку задачи наименьших квадратов: | ||
− | <tex> Q(\alpha, X^l) = \sum\limits_{i=1}^n (f(x_i, \alpha) - y_i)^2 = || F\alpha - y ||^2 \rightarrow \underset{\alpha}{min} </tex> | + | <tex> Q(\alpha, X^l) = \sum\limits_{i=1}^n (f(x_i, \alpha) - y_i)^2 = || F\alpha - y ||^2 \rightarrow \underset{\alpha}{min} </tex>. |
Необходимо найти вектор <tex> \alpha </tex> при известной матрице <tex> F </tex> и известном вектор-столбце <tex> y </tex>. | Необходимо найти вектор <tex> \alpha </tex> при известной матрице <tex> F </tex> и известном вектор-столбце <tex> y </tex>. | ||
Строка 58: | Строка 57: | ||
=== Нормальная система уравнений === | === Нормальная система уравнений === | ||
− | Запишем необходимые условия минимума в матричном виде | + | Запишем необходимые условия минимума в матричном виде: |
− | <tex> \frac{\partial Q }{\partial \alpha } (\alpha) = 2F^T (F\alpha - y) = 0 </tex> | + | <tex> \frac{\partial Q }{\partial \alpha } (\alpha) = 2F^T (F\alpha - y) = 0 </tex>. |
Отсюда следует нормальная система задачи МНК: | Отсюда следует нормальная система задачи МНК: | ||
Строка 66: | Строка 65: | ||
<tex> F^T F \alpha = F^T y </tex>, | <tex> F^T F \alpha = F^T y </tex>, | ||
− | где <tex> F^T F | + | где <tex> F^T F — n \times n </tex> матрица. |
Мы получили систему уравнений, откуда можем выразить искомый вектор <tex> \alpha </tex>. | Мы получили систему уравнений, откуда можем выразить искомый вектор <tex> \alpha </tex>. | ||
Строка 73: | Строка 72: | ||
<tex> \alpha^* = (F^T F)^{-1} F^T y = F^+ y </tex>, <br> где <tex> F^+ </tex> — псевдо-обратная матрица. | <tex> \alpha^* = (F^T F)^{-1} F^T y = F^+ y </tex>, <br> где <tex> F^+ </tex> — псевдо-обратная матрица. | ||
− | Значение функционала: <tex> Q(\alpha^*) = ||P_F y - y||^2 </tex>, <br> где <tex> P_F = F F^+ = F (F^T F)^{-1} F^T </tex> | + | Значение функционала: <tex> Q(\alpha^*) = ||P_F y - y||^2 </tex>, <br> где <tex> P_F = F F^+ = F (F^T F)^{-1} F^T </tex> — ''проекционная матрица''. |
==== Проблемы ==== | ==== Проблемы ==== | ||
Строка 81: | Строка 80: | ||
Если же столбцы матрицы <tex> F </tex> почти линейно-зависимы, то у нас возникнет масса вычислительных проблем с обращением этой матрицы. | Если же столбцы матрицы <tex> F </tex> почти линейно-зависимы, то у нас возникнет масса вычислительных проблем с обращением этой матрицы. | ||
− | === | + | === Решение МНК через сингулярное разложение === |
− | Воспользуемся понятием [ | + | Воспользуемся понятием [[ Сингулярное разложение | сингулярного разложения ]], которое позволяет произвольную прямоугольную матрицу представить в виде произведения трех матриц: |
<tex> F = V D U^T </tex>. | <tex> F = V D U^T </tex>. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Найдем псевдо-обратную матрицу: <br> <tex> F^+ = (U D V^T V D U^T)^{-1} U D V^T = U D^{-1} V^T = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j v_j^T </tex>. | Найдем псевдо-обратную матрицу: <br> <tex> F^+ = (U D V^T V D U^T)^{-1} U D V^T = U D^{-1} V^T = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j v_j^T </tex>. | ||
− | Теперь зная псевдо-обратную матрицу, найдем решение задачи наименьших квадратов: <br> <tex> \alpha^* = F^+ y = U D^{-1} V^T y = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j (v_j^T y) </tex>. | + | Теперь, зная псевдо-обратную матрицу, найдем решение задачи наименьших квадратов: <br> <tex> \alpha^* = F^+ y = U D^{-1} V^T y = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j (v_j^T y) </tex>. |
Найдем вектор, которым наша линейная модель аппроксимирует целевой вектор <tex> y </tex>: <br> <tex> F \alpha^* = P_F y = (V D U^T) U D^{-1} V^T y = V V^T y = \sum\limits_{j=1}^n v_j (v_j^T y) </tex>. | Найдем вектор, которым наша линейная модель аппроксимирует целевой вектор <tex> y </tex>: <br> <tex> F \alpha^* = P_F y = (V D U^T) U D^{-1} V^T y = V V^T y = \sum\limits_{j=1}^n v_j (v_j^T y) </tex>. | ||
Строка 107: | Строка 98: | ||
== Проблема мультиколлинеарности и переобучения == | == Проблема мультиколлинеарности и переобучения == | ||
− | Если имеются сингулярные числа | + | Если имеются сингулярные числа близкие к 0, то: |
* матрица <tex> \sum = F^T F </tex> плохо обусловлена; | * матрица <tex> \sum = F^T F </tex> плохо обусловлена; | ||
Строка 119: | Строка 110: | ||
* преобразование признаков, чтобы в новом признаковом пространстве признаков оказалось меньше, но они хорошо восстанавливали бы исходные: <br> <tex> f_1, \dots, f_n \rightarrow g_1 \dots, g_m, m \ll n </tex>. | * преобразование признаков, чтобы в новом признаковом пространстве признаков оказалось меньше, но они хорошо восстанавливали бы исходные: <br> <tex> f_1, \dots, f_n \rightarrow g_1 \dots, g_m, m \ll n </tex>. | ||
− | == Пример кода для Scikit-learn == | + | ==Примеры кода== |
+ | === Пример кода для Scikit-learn === | ||
'''import''' matplotlib.pyplot '''as''' plt | '''import''' matplotlib.pyplot '''as''' plt | ||
Строка 160: | Строка 152: | ||
[[Файл: Linear_regression_example.png]] | [[Файл: Linear_regression_example.png]] | ||
+ | |||
+ | ===Пример на языке Java=== | ||
+ | Пример линейной регресии с применением <code>weka.classifiers.functions.LinearRegression</code><ref>[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]</ref> | ||
+ | |||
+ | <code>Maven</code> зависимомсть: | ||
+ | <dependency> | ||
+ | <groupId>nz.ac.waikato.cms.weka</groupId> | ||
+ | <artifactId>weka-stable</artifactId> | ||
+ | <version>3.8.0</version> | ||
+ | </dependency> | ||
+ | |||
+ | '''import''' weka.classifiers.functions.LinearRegression; | ||
+ | '''import''' weka.core.Instance; | ||
+ | '''import''' weka.core.Instances; | ||
+ | |||
+ | <font color="green">//Load Data set</font> | ||
+ | '''var''' data = new Instances(new BufferedReader(new FileReader("dataset/house.arff"))); | ||
+ | data.setClassIndex(data.numAttributes() - 1); | ||
+ | <font color="green">//Build model</font> | ||
+ | '''var''' model = new LinearRegression(); | ||
+ | '''try''' { model.buildClassifier(data); } | ||
+ | '''catch''' (Exception e) { e.printStackTrace(); } | ||
+ | <font color="green">//output model</font> | ||
+ | System.out.printf("model parameters: %s%n", model); | ||
+ | <font color="green">// Now Predicting the cost</font> | ||
+ | '''var''' myHouse = data.lastInstance(); | ||
+ | '''var''' price = model.classifyInstance(myHouse); | ||
+ | System.out.printf("predicted price = %s%n", price) | ||
+ | |||
+ | ===Пример на языке R=== | ||
+ | {{Main|Примеры кода на R}} | ||
+ | |||
+ | <font color="gray"># reading data</font> | ||
+ | data <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) | ||
+ | |||
+ | <font color="gray"># evaluating linear regression model</font> | ||
+ | model <- lm(data$<strong><font color="#660E7A">x</font></strong> ~ data$<strong><font color="#660E7A">y</font></strong>) | ||
+ | |||
+ | <font color="gray"># getting summary</font> | ||
+ | print(summary(model)) | ||
+ | |||
+ | <font color="gray"># visualizing data</font> | ||
+ | plot(data$<strong><font color="#660E7A">y</font></strong>, data$<strong><font color="#660E7A">x</font></strong>) | ||
+ | lines(data$<strong><font color="#660E7A">y</font></strong>, predict(fit), <font color="#660099">col</font> = <font color="green">'red'</font>) | ||
+ | |||
+ | ==Применение== | ||
+ | |||
+ | Перечислим несколько примеров реального применения линейной регрессии: | ||
+ | |||
+ | * для предсказания скидки на продукты на основе поведения покупателей в прошлом; | ||
+ | * экономисты использую линейную регрессия для предсказания экономического роста страны или региона; | ||
+ | * застройщики при помощи данного метода могут предсказать, сколько домов он продаст в ближайшие месяцы и по какой цене; | ||
+ | * цены на нефть могут быть предсказаны с использованием линейной регрессии. | ||
==См. также== | ==См. также== | ||
Строка 167: | Строка 212: | ||
* [[Логистическая регрессия]] | * [[Логистическая регрессия]] | ||
* [[Обзор библиотек для машинного обучения на Python]] | * [[Обзор библиотек для машинного обучения на Python]] | ||
+ | * [[Переобучение]] | ||
==Источники информации== | ==Источники информации== | ||
Строка 174: | Строка 220: | ||
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов] | * [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов] | ||
* [https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py Scikit-Learn {{---}} Linear Regression Example] | * [https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py Scikit-Learn {{---}} Linear Regression Example] | ||
+ | * [https://www.quora.com/What-are-some-real-world-applications-of-simple-linear-regression What are some real-world applications of "simple" linear regression?] | ||
[[Категория: Машинное обучение]] | [[Категория: Машинное обучение]] | ||
[[Категория: Регрессия]] | [[Категория: Регрессия]] |
Текущая версия на 19:24, 4 сентября 2022
Линейная регрессия (англ. linear regression) — метод восстановления зависимости одной (объясняемой, зависимой) переменной
от другой или нескольких других переменных (факторов, регрессоров, независимых переменных) с линейной функцией зависимости. Данный метод позволяет предсказывать значения зависимой переменной по значениям независимой переменной .Содержание
Задача
Дано
- — числовые признаки;
- модель многомерной линейной регрессии:
,
где ; - обучающая выборка: множество из пар ;
- — объекты из множества ;
- — объекты из множества .
Матричные обозначения
Перейдем к матричным обозначениям:
,
где
- — матрица объектов-признаков, где строки соответствуют объектам а столбцы — признакам;
- — вектор ответов, или целевой вектор;
- — вектор коэффициентов.
Постановка задачи
В этих трех векторно-матричных обозначениях очень удобно расписать постановку задачи наименьших квадратов:
.
Необходимо найти вектор
при известной матрице и известном вектор-столбце .Решение
Нормальная система уравнений
Запишем необходимые условия минимума в матричном виде:
.
Отсюда следует нормальная система задачи МНК:
,
где
матрица.Мы получили систему уравнений, откуда можем выразить искомый вектор
.Решение системы
где — псевдо-обратная матрица.
Значение функционала:
где — проекционная матрица.
Проблемы
В случае мультиколлинеарности (столбцы матрицы
линейно-зависимы) нам не удастся найти обратную матрицу к (она будет вырождена).Если же столбцы матрицы
почти линейно-зависимы, то у нас возникнет масса вычислительных проблем с обращением этой матрицы.Решение МНК через сингулярное разложение
Воспользуемся понятием сингулярного разложения , которое позволяет произвольную прямоугольную матрицу представить в виде произведения трех матриц:
.
Найдем псевдо-обратную матрицу:
.
Теперь, зная псевдо-обратную матрицу, найдем решение задачи наименьших квадратов:
.
Найдем вектор, которым наша линейная модель аппроксимирует целевой вектор
.
Квадрат нормы вектора коэффициентов:
.
В 3-х из 4-х формул сингулярные числа оказались в знаменателе. Если имеются сингулярные числа приближающиеся к 0, то мы получаем проблему мультиколлинеарности. Близкие к 0 собственные значения или сингулярные числа — показатель того, что среди признаков есть почти линейно-зависимый.
Проблема мультиколлинеарности и переобучения
Если имеются сингулярные числа близкие к 0, то:
- матрица плохо обусловлена;
- решение становится неустойчивым и неинтерпретируемым, слишком большие коэффициенты разных знаков;
- возникает переобучение:
на обучении мало;
на контроле велико.
Стратегии устранения мультиколлинеарности и переобучения:
- отбор признаков, то есть выкидываем те признаки, которые могут оказаться линейно-зависимыми:
; - регуляризация (накладываем дополнительные ограничения на вектор коэффициентов):
; - преобразование признаков, чтобы в новом признаковом пространстве признаков оказалось меньше, но они хорошо восстанавливали бы исходные:
.
Примеры кода
Пример кода для Scikit-learn
import matplotlib.pyplot as plt from sklearn import datasets, linear_model # generate dataset X, y = datasets.make_regression(n_samples=1_000, n_features=1, noise=8, shuffle=True) # test and train data sizes train_size = 700 test_size = 300 # split the data into training/testing sets X_train = X[:-train_size] X_test = X[-test_size:] # split the targets into training/testing sets y_train = y[:-train_size] y_test = y[-test_size:] # create linear regression object regr = linear_model.LinearRegression() # train the model using the training sets regr.fit(X_train, y_train) # make predictions using the testing set y_pred = regr.predict(X_test) # plot outputs plt.scatter(X_test, y_test, color='red', s=5) plt.plot(X_test, y_pred, color='blue', linewidth=2) plt.xticks(()) plt.yticks(()) plt.show()
Возможный результат исполнения программы:
Пример на языке Java
Пример линейной регресии с применением weka.classifiers.functions.LinearRegression
[1]
Maven
зависимомсть:
<dependency> <groupId>nz.ac.waikato.cms.weka</groupId> <artifactId>weka-stable</artifactId> <version>3.8.0</version> </dependency>
import weka.classifiers.functions.LinearRegression; import weka.core.Instance; import weka.core.Instances;
//Load Data set var data = new Instances(new BufferedReader(new FileReader("dataset/house.arff"))); data.setClassIndex(data.numAttributes() - 1); //Build model var model = new LinearRegression(); try { model.buildClassifier(data); } catch (Exception e) { e.printStackTrace(); } //output model System.out.printf("model parameters: %s%n", model); // Now Predicting the cost var myHouse = data.lastInstance(); var price = model.classifyInstance(myHouse); System.out.printf("predicted price = %s%n", price)
Пример на языке R
# reading data data <- read.csv("input.csv", sep = ',', header = FALSE) # evaluating linear regression model model <- lm(data$x ~ data$y) # getting summary print(summary(model)) # visualizing data plot(data$y, data$x) lines(data$y, predict(fit), col = 'red')
Применение
Перечислим несколько примеров реального применения линейной регрессии:
- для предсказания скидки на продукты на основе поведения покупателей в прошлом;
- экономисты использую линейную регрессия для предсказания экономического роста страны или региона;
- застройщики при помощи данного метода могут предсказать, сколько домов он продаст в ближайшие месяцы и по какой цене;
- цены на нефть могут быть предсказаны с использованием линейной регрессии.
См. также
- Общие понятия
- Вариации регрессии
- Логистическая регрессия
- Обзор библиотек для машинного обучения на Python
- Переобучение
Источники информации
- machinelearning.ru — Многомерная линейная регрессия
- machinelearning.ru — Линейная регрессия (пример)
- Coursera — "Введение в машинное обучение", Неделя 4,
- Лекции по алгоритмам восстановления регрессии К. В. Воронцов
- Scikit-Learn — Linear Regression Example
- What are some real-world applications of "simple" linear regression?