1632
правки
Изменения
м
f_nf_1(x_1x_l) & \dots & f_n(x_l)
</tex> , где* <tex> F </tex> - — матрица объектов-признаков, где строки соответствуют объектам а столбцы - — признакам;* <tex> y </tex> - — вектор ответов, или целевой вектор;* <tex> \alpha </tex> - — вектор коэффициентов.
Основные свойства сингулярного разложения:
* <tex> l \times n </tex>-матрица <tex> V = (v_1, \dots, v_n) </tex> ортогональна, <tex> V^T V = I_n </tex>, <br> столбцы <tex> v_j </tex> — собственные векторы матрицы <tex> F F^T </tex>;
* <tex> n \times n </tex>-матрица <tex> U = (u_1, \dots, u_n) </tex> ортогональна, <tex> U^T U = I_n </tex>, <br> столбцы <tex> u_j </tex> — собственные векторы матриц <tex> F^T F </tex>;
* <tex> n \times n </tex>-матрица <tex> D </tex> диагональна, <tex> D = diag(\sqrt{\lambda_1}, \dots, \sqrt{\lambda_n}) </tex>, <br> <tex> \lambda_j \geq 0 </tex> — собственные значения матриц <tex> F^T F </tex> и <tex> F F^T </tex>, <br> <tex> \sqrt{ \lambda_j } </tex> — сингулярные числа матрицы <tex> F </tex>.
=== Решение МНК через сингулярное разложение ===
rollbackEdits.php mass rollback
==== Дано ====
* <tex> f_1(x), \dots ,f_n(x) </tex> - — числовые признаки;* модель многомерной линейной регрессии:<centerbr> <tex> f(x,\alpha) = \sum\limits_{j=1}^n \alpha_j f_j(x) </tex>, </centerbr>где <tex> a \in R^n </tex>;* обучающая выборка: множество из пар <tex>(x_i, y_i)_{i=1 \dots n}</tex>;* <tex> x_i </tex> - — объекты из множества <tex> X = R^n </tex>;* <tex> y_i </tex> - — объекты из множества <tex> X = R </tex>.
==== Матричные обозначения ====
f_1(x_1) & \dots & f_n(x_1) \\
\dots & \dots & \dots \\
\end{pmatrix}
,
\alpha_1 \\
\dots \\
\alpha_lalpha_n
\end{pmatrix}
</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> \frac{\partial Q }{\partial \alpha } (\alpha) = 2F^T (F\alpha - y) = 0 </tex>.
Отсюда следует нормальная система задачи МНК:
<tex> F^T F \alpha = F^T y </tex>,
где <tex> F^T F - — n \times n </tex> матрица.
Мы получили систему уравнений, откуда можем выразить искомый вектор <tex> \alpha </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> F </tex> почти линейно-зависимы, то у нас возникнет масса вычислительных проблем с обращением этой матрицы.
=== Сингулярное Решение МНК через сингулярное разложение ===
Воспользуемся понятием [https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5/ [ Сингулярное разложение | сингулярного разложения ]], которое позволяет произвольную прямоугольную матрицу представить в виде произведения трех матриц:
<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> \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>.
== Проблема мультиколлинеарности и переобучения ==
Если имеются сингулярные числа, близкие к 0, то:
* матрица <tex> \sum = F^T F </tex> плохо обусловлена;
* преобразование признаков, чтобы в новом признаковом пространстве признаков оказалось меньше, но они хорошо восстанавливали бы исходные: <br> <tex> f_1, \dots, f_n \rightarrow g_1 \dots, g_m, m \ll n </tex>.
==Примеры кода===== Пример кода для Scikit-learn ===
'''import''' matplotlib.pyplot '''as''' plt
[[Файл: 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>)
==Применение==
Перечислим несколько примеров реального применения линейной регрессии:
* для предсказания скидки на продукты на основе поведения покупателей в прошлом;
* экономисты использую линейную регрессия для предсказания экономического роста страны или региона;
* застройщики при помощи данного метода могут предсказать, сколько домов он продаст в ближайшие месяцы и по какой цене;
* цены на нефть могут быть предсказаны с использованием линейной регрессии.
==См. также==
* [[Логистическая регрессия]]
* [[Обзор библиотек для машинного обучения на Python]]
* [[Переобучение]]
==Источники информации==
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Многомерная линейная регрессия]
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]
* [https://www.coursera.org/learn/vvedenie-mashinnoe-obuchenie/home/info Coursera {{---}} "Введение в машинное обучение", Неделя 4, ]
* [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://www.quora.com/What-are-some-real-world-applications-of-simple-linear-regression What are some real-world applications of "simple" linear regression?]
[[Категория: Машинное обучение]]
[[Категория: Регрессия]]