Изменения

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

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

2176 байт добавлено, 01:53, 29 ноября 2020
м
Ссылка на основную статью
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> — вектор ответов, или целевой вектор;
Найдем псевдо-обратную матрицу: <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>)
==Применение==
286
правок

Навигация