Изменения

Перейти к: навигация, поиск

Линейная регрессия

1325 байт добавлено, 14:58, 25 февраля 2020
Матричные обозначения: Изменил индекс последнего члена вектора коэффициентов с l на n
f_1(x_1) & \dots & f_n(x_1) \\
\dots & \dots & \dots \\
f_nf_1(x_1x_l) & \dots & f_n(x_l)
\end{pmatrix}
,
\alpha_1 \\
\dots \\
\alpha_lalpha_n
\end{pmatrix}
</tex>,
</tex> , где
* <tex> F </tex> — матрица объектов-признаков, где строки соответствуют объектам а столбцы — признакам;
* <tex> y </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> — ''проекционная матрица''.
==== Проблемы ====
Найдем псевдо-обратную матрицу: <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)
==Применение==
Анонимный участник

Навигация