Линейная регрессия (пример)
Материал из MachineLearning.
(Новая: {{TOCright}} '''Линейная регрессия''' {{UnderConstruction|~~~~}} == Постановка задачи == == Алгоритм == == Пример == == Смотри ...) |
|||
| Строка 1: | Строка 1: | ||
| - | + | '''Линейная регрессия''' — метод восстановления зависимости между двумя переменными. | |
| + | Ниже приведен пример программы, которая строит линейную модель зависимости по | ||
| + | заданной выборке и показывает результат на графике. | ||
| - | + | Для заданного множества из <tex>m</tex> пар <tex>(x_i, y_i)</tex>, <tex>i=1,\ldots, m</tex>, | |
| - | {{ | + | значений [[регрессионный анализ|свободной и зависимой переменной]] |
| + | требуется построить зависимость. | ||
| + | Назначена линейная [[регрессионная модель|модель]] | ||
| + | <center><tex>y_i= f(\mathbf{w},x_i) + \varepsilon_i</tex></center> | ||
| + | c аддитивной [[случайной величиной|случайной величиной]] <tex>\varepsilon</tex>. | ||
| + | Переменные <tex>x, y</tex> принимают значения на числовой прямой <tex>\mathbb{R}</tex>. | ||
| + | Предполагается, что [[случайная величина|случайная величина]] | ||
| + | [[функция распределения|распределена]] | ||
| + | [[семейство экспоненциальных распределений|нормально]] с нулевым матожиданием и | ||
| + | фиксированной дисперсией <tex>\sigma²_\varepsilon</tex>, которая не зависит от переменных <tex>x, y</tex>. | ||
| + | При таких предположениях параметры <tex>\mathbf{w}</tex> регрессионной модели вычисляются с помощью | ||
| + | [[метод наименьших квадратов|метода наименьших квадратов]]. | ||
| + | Например, требуется построить зависимость цены нарезного хлеба от времени. | ||
| + | В [[Media:bread_narez_norm.doc|таблице регрессионной выборки]] первая колонка — зависимая переменная (цена батона хлеба), | ||
| + | вторая — свободная (время). Всего данные содержат 195 пар значений переменных. Данные нормированы. | ||
| - | == | + | == Одномерная регрессия == |
| + | Определим модель зависимости как | ||
| + | <center><tex>y_i= w_1 + w_2x_i + \varepsilon_i.</tex></center> | ||
| + | Согласно методу наименьших квадратов, искомый | ||
| + | вектор параметров <tex>\mathbf{w}=(w_1,w_2)^T</tex> есть решение нормального уравнения | ||
| + | <center><tex>\mathbf{w} = (A^TA)^{-1}A^T\mathbf{y},</tex></center> | ||
| + | где <tex>\mathbf{y}</tex> — вектор, состоящий из значений зависимой переменной, | ||
| + | <tex>\mathbf{y}=(y_1,\ldots, y_m)</tex>. | ||
| + | Столбцы матрицы <tex>A</tex> есть подстановки значений свободной переменной | ||
| + | <tex>x_i^0\mapsto a_{i1}</tex> и <tex>x_i^1\mapsto a_{i2}</tex>, <tex>i=1,\ldots, m</tex>. Матрица имеет вид | ||
| + | <center><tex>A =\left(\begin{array}{cc} 1 & x_1\\ 1 & x_2\\ \ldots & \ldots \\ 1 & x_m\\ \end{array} \right).</tex></center> | ||
| + | Зависимая переменная восстанавливается по полученным весам и | ||
| + | заданным значениям свободной переменной | ||
| + | <center><tex>y^*_i = w_1+w_2x_i,</tex></center> | ||
| + | иначе | ||
| + | <center><tex>\mathbf{y}^* = A\mathbf{w}.</tex></center> | ||
| + | % | ||
| + | Для оценки качества модели используется критерий суммы квадратов регрессионных остатков, | ||
| + | SSE — Sum of Squared Errors. | ||
| + | <center><tex>SSE = \sum_{i=1}^m(y_i-y_i^*)² = (\mathbf{y} — \mathbf{y}^*)^T(\mathbf{y} — \mathbf{y}^*).</tex></center> | ||
| - | == | + | Пример нахождения параметров модели и восстановления линейной регрессии. |
| + | <source lang="matlab"> | ||
| + | A = [x.^0, x]; % построить матрицу подстановок | ||
| + | % x - (m,1)-вектор, у - (m,1)-вектор | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | % методом гауссова исключения | ||
| + | w = pinv(A'*A)*(A'*y);% вариант обращения матрицы | ||
| + | y1 = w(1)+w(2)*x; % восстановить зависимую переменную | ||
| + | % при заданных значениях x | ||
| + | r = y-y1; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | </source> | ||
| - | == Пример == | + | [[Изображение:regression_onedim.png|500px]] |
| + | |||
| + | == Полиномиальная регрессия == | ||
| + | Пусть регрессионная модель — полином заданной степени <tex>p</tex>, | ||
| + | <center><tex>y_i= \sum_{j=1}^p w_j x_i^{j-1} + \varepsilon_i.</tex></center> | ||
| + | Матрица <tex>A</tex> в случае полиномиальной регрессии называется матрицей Вандермонда и | ||
| + | принимает вид | ||
| + | <center><tex>A =\left(\begin{array}{ccccc} 1 & x_1 & x_1² & \ldots & x_1^p\\ 1 & x_2 & x_2² & \ldots & x_2^p\\ \ldots & \ldots & \ldots & \ldots\\ 1 & x_m & x_m² & \ldots & x_m^p\\ \end{array} \right).</tex></center> | ||
| + | Одномерная регрессия — частный случай полиномиальной регрессии. | ||
| + | |||
| + | Пример нахождения параметров модели и восстановления полиномиальной регрессии. | ||
| + | <source lang="matlab"> | ||
| + | % функция для построения матрицы подстановок | ||
| + | f = inline('[x.^0, x, x.^2, x.^3]','x'); | ||
| + | A = f(x); % матрица подстановок есть функция | ||
| + | % значений свободной переменой | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | y2 = A*w; % восстановить зависимую переменную | ||
| + | r = y-y2; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | </source> | ||
| + | |||
| + | [[Изображение:regression_poly.png|500px]] | ||
| + | |||
| + | == Криволинейная регрессия == | ||
| + | |||
| + | Пусть исходные признаки преобразованы с помощью некоторых заданных, в общем случае нелинейных | ||
| + | функций <tex>g_1,\ldots, g_n</tex>. При этом функции не должны содержать дополнительных | ||
| + | параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на | ||
| + | всех значениях, которые принимает свободная переменная. | ||
| + | % | ||
| + | Матрица <tex>A</tex> в случае полиномиальной регрессии называется обобщенной матрицей Вандермонда и | ||
| + | принимает вид | ||
| + | <center><tex>A =\left(\begin{array}{ccc} g_1(x_1) & \ldots & g_n(x_1)\\ g_1(x_2) & \ldots & g_n(x_2)\\ \ldots & \ldots & \ldots \\ g_1(x_m) & \ldots & g_n(x_m)\\ \end{array} \right). </tex></center> | ||
| + | Полиномиальная регрессия — частный случай криволинейной регрессии. | ||
| + | |||
| + | Пример нахождения параметров модели и восстановления криволинейной регрессии. | ||
| + | <source lang="matlab"> | ||
| + | % функция для построения матрицы подстановок | ||
| + | f = inline('[x.^0, x, sin(10*x)]','x'); | ||
| + | A = f(x); % матрица подстановок | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | y3 = A*w; % восстановить зависимую переменную | ||
| + | r = y-y3; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | </source> | ||
| + | |||
| + | [[Изображение:regression_curve.png|500px]] | ||
| + | |||
| + | == Исходный код == | ||
| + | (Этот раздел должен быть скрыт) | ||
| + | |||
| + | <source lang="matlab"> | ||
| + | %% Линейная регрессия | ||
| + | % Исходный код к статье "Линейная регрессия (пример)" | ||
| + | % www.machinelearning.ru | ||
| + | |||
| + | %% Получить данные из файла | ||
| + | % В файле содержаться цены на хлеб "нарезной" за несколько месяцев | ||
| + | D = dlmread('bread_narez_norm.doc'); | ||
| + | y = D( :,1); % в первом столбце значения зависимой переменной | ||
| + | x = D( :,2); % во втором столбце - независимой | ||
| + | |||
| + | %% Смоделировать исходные данные | ||
| + | % Если файл данных отстутствует, можно создать данные самостятельно | ||
| + | |||
| + | % x = linspace(0,10,200)'; % независимая переменная, значения | ||
| + | % y = x + 1.5*sin(x) + randn(size(x,1),1); % зависимая переменная имеет | ||
| + | % наложенную случайную переменную с нулевым матожиданием и однородной | ||
| + | % дисперсией | ||
| + | |||
| + | %% Настроить параметры графиков | ||
| + | % Используется внешняя функция plot_regression_2d | ||
| + | %pltopts.xdate='on'; % ось абсцисс - дата | ||
| + | pltopts.ftype={'psc2', 'png'}; % записать графиков файлы в формате .eps и .png | ||
| + | |||
| + | %% Одномерная регрессия | ||
| + | % Восстанавливаемая регрессионная зависимость - прямая на плоскости. | ||
| + | model1 = 'y=w_1+w_2x'; | ||
| + | |||
| + | A = [x.^0, x]; % построить матрицу подстановок | ||
| + | % x - (m,1)-вектор, у - (m,1)-вектор | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | % методом гауссова исключения | ||
| + | w = pinv(A'*A)*(A'*y);% вариант обращения матрицы | ||
| + | y1 = w(1)+w(2)*x; % восстановить зависимую переменную | ||
| + | % при заданных значениях x | ||
| + | r = y-y1; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | |||
| + | % нарисовать график | ||
| + | pltopts.legend = {'sample set',model1}; | ||
| + | pltopts.fname = 'regression_onedim'; | ||
| + | plot_regression_2d(x,[y y1], pltopts); | ||
| + | %% | ||
| + | % <<regression_onedim.png>> | ||
| + | |||
| + | %% Полиномиальная регрессия | ||
| + | % Восстанавливаемая зависимость - кубическая кривая | ||
| + | model2 = 'y=w_1+w_2x+w_3x^2+w_4x^3'; | ||
| + | |||
| + | % функция для построения матрицы подстановок | ||
| + | f = inline('[x.^0, x, x.^2, x.^3]','x'); | ||
| + | A = f(x); % матрица подстановок есть функция | ||
| + | % значений свободной переменой | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | y2 = A*w; % восстановить зависимую переменную | ||
| + | r = y-y2; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | |||
| + | % нарисовать график | ||
| + | pltopts.legend = {'sample set',model2}; | ||
| + | pltopts.fname = 'regression_poly'; | ||
| + | plot_regression_2d(x,[y y2], pltopts); | ||
| + | %% | ||
| + | % <<regression_poly.png>> | ||
| + | |||
| + | %% Криволинейная регрессия | ||
| + | % Восстанавляваемая зависимость, кроме мнономов, содержит другие функции, | ||
| + | % нелинейные относительно независимой переменной | ||
| + | model3 = 'y=w_1+w_2x+w_3sin(10x)'; | ||
| + | |||
| + | f = inline('[x.^0, x, sin(10*x)]','x'); | ||
| + | A = f(x); % матрица подстановок | ||
| + | w = (A'*A)\(A'*y); % решить нормальное уравнение | ||
| + | y3 = A*w; % восстановить зависимую переменную | ||
| + | r = y-y3; % найти вектор регрессионных остатков | ||
| + | SSE = r'*r % подсчитать ошибку | ||
| + | |||
| + | % нарисовать график | ||
| + | pltopts.legend = {'sample set', model1, model2, model3}; | ||
| + | pltopts.fname = 'regression_curve'; | ||
| + | plot_regression_2d(x,[y y1 y2 y3], pltopts); | ||
| + | %% | ||
| + | % <<regression_curve.png>> | ||
| + | </source> | ||
== Смотри также == | == Смотри также == | ||
| - | |||
| - | |||
* [[Метод наименьших квадратов]] | * [[Метод наименьших квадратов]] | ||
| + | * [[Регрессионный анализ]] | ||
| + | * [[Media:wiki_linear_regression_example.pdf|Эта статья в формате PDF]] | ||
| + | |||
| + | == Литература == | ||
| + | * Дрейпер Н., Смит Г. Прикладной регрессионный анализ. Издательский дом «Вильямс». 2007. 912 с. | ||
| + | * Стрижов В. В. Методы индуктивного порождения регрессионных моделей. М.: ВЦ РАН. 2008. 55 с. [[Media:strijov08ln.pdf|Брошюра, PDF]]. | ||
| - | [ | + | == Исходный код == |
| - | [ | + | * [http://strijov.com/sources/wiki_demo_least_squares_fit.m Исходный код данного примера], |
| + | * [http://strijov.com/sources/bread_narez_norm.csv Регрессионная выборка, таблица], | ||
| + | * [http://strijov.com/sources/plot_regression_2d.m Bспомогательный файл]. | ||
Версия 11:08, 17 октября 2008
Линейная регрессия — метод восстановления зависимости между двумя переменными. Ниже приведен пример программы, которая строит линейную модель зависимости по заданной выборке и показывает результат на графике.
Для заданного множества из пар
,
,
значений свободной и зависимой переменной
требуется построить зависимость.
Назначена линейная модель
c аддитивной случайной величиной .
Переменные
принимают значения на числовой прямой
.
Предполагается, что случайная величина
распределена
нормально с нулевым матожиданием и
фиксированной дисперсией
, которая не зависит от переменных
.
При таких предположениях параметры
регрессионной модели вычисляются с помощью
метода наименьших квадратов.
Например, требуется построить зависимость цены нарезного хлеба от времени. В таблице регрессионной выборки первая колонка — зависимая переменная (цена батона хлеба), вторая — свободная (время). Всего данные содержат 195 пар значений переменных. Данные нормированы.
Содержание |
Одномерная регрессия
Определим модель зависимости как
Согласно методу наименьших квадратов, искомый
вектор параметров есть решение нормального уравнения
где — вектор, состоящий из значений зависимой переменной,
.
Столбцы матрицы
есть подстановки значений свободной переменной
и
,
. Матрица имеет вид
Зависимая переменная восстанавливается по полученным весам и заданным значениям свободной переменной
иначе
% Для оценки качества модели используется критерий суммы квадратов регрессионных остатков, SSE — Sum of Squared Errors.
Пример нахождения параметров модели и восстановления линейной регрессии.
A = [x.^0, x]; % построить матрицу подстановок % x - (m,1)-вектор, у - (m,1)-вектор w = (A'*A)\(A'*y); % решить нормальное уравнение % методом гауссова исключения w = pinv(A'*A)*(A'*y);% вариант обращения матрицы y1 = w(1)+w(2)*x; % восстановить зависимую переменную % при заданных значениях x r = y-y1; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку
Полиномиальная регрессия
Пусть регрессионная модель — полином заданной степени ,
Матрица в случае полиномиальной регрессии называется матрицей Вандермонда и
принимает вид
Одномерная регрессия — частный случай полиномиальной регрессии.
Пример нахождения параметров модели и восстановления полиномиальной регрессии.
% функция для построения матрицы подстановок f = inline('[x.^0, x, x.^2, x.^3]','x'); A = f(x); % матрица подстановок есть функция % значений свободной переменой w = (A'*A)\(A'*y); % решить нормальное уравнение y2 = A*w; % восстановить зависимую переменную r = y-y2; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку
Криволинейная регрессия
Пусть исходные признаки преобразованы с помощью некоторых заданных, в общем случае нелинейных
функций . При этом функции не должны содержать дополнительных
параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на
всех значениях, которые принимает свободная переменная.
%
Матрица
в случае полиномиальной регрессии называется обобщенной матрицей Вандермонда и
принимает вид
Полиномиальная регрессия — частный случай криволинейной регрессии.
Пример нахождения параметров модели и восстановления криволинейной регрессии.
% функция для построения матрицы подстановок f = inline('[x.^0, x, sin(10*x)]','x'); A = f(x); % матрица подстановок w = (A'*A)\(A'*y); % решить нормальное уравнение y3 = A*w; % восстановить зависимую переменную r = y-y3; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку
Исходный код
(Этот раздел должен быть скрыт)
%% Линейная регрессия % Исходный код к статье "Линейная регрессия (пример)" % www.machinelearning.ru %% Получить данные из файла % В файле содержаться цены на хлеб "нарезной" за несколько месяцев D = dlmread('bread_narez_norm.doc'); y = D( :,1); % в первом столбце значения зависимой переменной x = D( :,2); % во втором столбце - независимой %% Смоделировать исходные данные % Если файл данных отстутствует, можно создать данные самостятельно % x = linspace(0,10,200)'; % независимая переменная, значения % y = x + 1.5*sin(x) + randn(size(x,1),1); % зависимая переменная имеет % наложенную случайную переменную с нулевым матожиданием и однородной % дисперсией %% Настроить параметры графиков % Используется внешняя функция plot_regression_2d %pltopts.xdate='on'; % ось абсцисс - дата pltopts.ftype={'psc2', 'png'}; % записать графиков файлы в формате .eps и .png %% Одномерная регрессия % Восстанавливаемая регрессионная зависимость - прямая на плоскости. model1 = 'y=w_1+w_2x'; A = [x.^0, x]; % построить матрицу подстановок % x - (m,1)-вектор, у - (m,1)-вектор w = (A'*A)\(A'*y); % решить нормальное уравнение % методом гауссова исключения w = pinv(A'*A)*(A'*y);% вариант обращения матрицы y1 = w(1)+w(2)*x; % восстановить зависимую переменную % при заданных значениях x r = y-y1; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку % нарисовать график pltopts.legend = {'sample set',model1}; pltopts.fname = 'regression_onedim'; plot_regression_2d(x,[y y1], pltopts); %% % <<regression_onedim.png>> %% Полиномиальная регрессия % Восстанавливаемая зависимость - кубическая кривая model2 = 'y=w_1+w_2x+w_3x^2+w_4x^3'; % функция для построения матрицы подстановок f = inline('[x.^0, x, x.^2, x.^3]','x'); A = f(x); % матрица подстановок есть функция % значений свободной переменой w = (A'*A)\(A'*y); % решить нормальное уравнение y2 = A*w; % восстановить зависимую переменную r = y-y2; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку % нарисовать график pltopts.legend = {'sample set',model2}; pltopts.fname = 'regression_poly'; plot_regression_2d(x,[y y2], pltopts); %% % <<regression_poly.png>> %% Криволинейная регрессия % Восстанавляваемая зависимость, кроме мнономов, содержит другие функции, % нелинейные относительно независимой переменной model3 = 'y=w_1+w_2x+w_3sin(10x)'; f = inline('[x.^0, x, sin(10*x)]','x'); A = f(x); % матрица подстановок w = (A'*A)\(A'*y); % решить нормальное уравнение y3 = A*w; % восстановить зависимую переменную r = y-y3; % найти вектор регрессионных остатков SSE = r'*r % подсчитать ошибку % нарисовать график pltopts.legend = {'sample set', model1, model2, model3}; pltopts.fname = 'regression_curve'; plot_regression_2d(x,[y y1 y2 y3], pltopts); %% % <<regression_curve.png>>
Смотри также
Литература
- Дрейпер Н., Смит Г. Прикладной регрессионный анализ. Издательский дом «Вильямс». 2007. 912 с.
- Стрижов В. В. Методы индуктивного порождения регрессионных моделей. М.: ВЦ РАН. 2008. 55 с. Брошюра, PDF.

