Изменения

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

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

5389 байт добавлено, 14:56, 12 марта 2019
Дано
* <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> \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>. Квадрат нормы вектора коэффициентов: <br> <tex> || \alpha^* ||^2 = ||D^{-1} V^T y||^2 = \sum\limits_{j=1}^n \frac{ 1 }{ \lambda_j } (v_j^T y)^2 </tex>. В 3-х из 4-х формул сингулярные числа оказались в знаменателе. Если имеются сингулярные числа приближающиеся к 0, то мы получаем проблему мультиколлинеарности. Близкие к 0 собственные значения или сингулярные числа — показатель того, что среди признаков есть почти линейно-зависимый. == Проблема мультиколлинеарности и переобучения == Если имеются сингулярные числа, близкие к 0, то: * матрица <tex> \sum = F^T F </tex> плохо обусловлена;* решение становится неустойчивым и неинтерпретируемым, слишком большие коэффициенты <tex> || \alpha_j || </tex> разных знаков;* возникает переобучение: <br> на обучении <tex> Q( \alpha^*, X^l ) = ||F \alpha^* - y||^2 </tex>мало;<br> на контроле <tex> Q( \alpha^*, X^k ) = ||F' \alpha^* - y'||^2 </tex> велико. Стратегии устранения мультиколлинеарности и переобучения: * отбор признаков, то есть выкидываем те признаки, которые могут оказаться линейно-зависимыми: <br> <tex> f_1, \dots, f_n \rightarrow f_{j_1} \dots, f_{j_m}, m \leq n </tex>;* регуляризация (накладываем дополнительные ограничения на вектор коэффициентов): <br> <tex> || \alpha || \rightarrow min </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 '''from''' sklearn '''import''' datasets, linear_model <font color = green># generate dataset</font> X, y = datasets.make_regression(n_samples=1_000, n_features=1, noise=8, shuffle=True) <font color = green># test and train data sizes</font> train_size = 700 test_size = 300 <font color = green># split the data into training/testing sets</font> X_train = X[:-train_size] X_test = X[-test_size:] <font color = green># split the targets into training/testing sets</font> y_train = y[:-train_size] y_test = y[-test_size:] <font color = green># create linear regression object</font> regr = linear_model.LinearRegression() <font color = green># train the model using the training sets</font> regr.fit(X_train, y_train) <font color = green># make predictions using the testing set</font> y_pred = regr.predict(X_test) <font color = green># plot outputs</font> 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() Возможный результат исполнения программы: [[Файл: Linear_regression_example.png]] ==См. также==
<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>;[[Общие понятия]]* [[Вариации регрессии]]* [[Логистическая регрессия]]* [[Обзор библиотек для машинного обучения на Python]]
<tex> F \alpha^==Источники информации==* [http://www.machinelearning.ru/wiki/index.php?title= P_F y = (V D U^T) U D^%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 {{-1--} V^T y } Многомерная линейная регрессия]* [http://www.machinelearning.ru/wiki/index.php?title= V V^T y = \sum\limits_%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 {{j=1---}}^n v_j Линейная регрессия (v_j^T yпример) <]* [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/tex>;linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py Scikit-Learn {{---}} Linear Regression Example]
<tex> || \alpha^* ||^2 = ||D^{-1} V^T y||^2 = \sum\limits_{j=1}^n \frac{ 1 }{ \lambda_j } (v_j^T y)^2 </tex>.[[Категория: Машинное обучение]][[Категория: Регрессия]]
18
правок

Навигация