Линейная регрессия (пример)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{TOCright}} '''Линейная регрессия''' {{UnderConstruction|~~~~}} == Постановка задачи == == Алгоритм == == Пример == == Смотри ...)
Строка 1: Строка 1:
-
{{TOCright}}
+
'''Линейная регрессия''' — метод восстановления зависимости между двумя переменными.
 +
Ниже приведен пример программы, которая строит линейную модель зависимости по
 +
заданной выборке и показывает результат на графике.
-
'''Линейная регрессия'''
+
Для заданного множества из&nbsp;<tex>m</tex> пар <tex>(x_i, y_i)</tex>, <tex>i=1,\ldots, m</tex>,
-
{{UnderConstruction|[[Участник:Strijov|Strijov]] 13:34, 16 октября 2008 (MSD)}}
+
значений [[регрессионный анализ|свободной и зависимой переменной]]
 +
требуется построить зависимость.
 +
Назначена линейная [[регрессионная модель|модель]]
 +
<center><tex>y_i= f(\mathbf{w},x_i) + \varepsilon_i</tex></center>
 +
c аддитивной [[случайной величиной|случайной величиной]] <tex>\varepsilon</tex>.
 +
Переменные&nbsp;<tex>x, y</tex> принимают значения на числовой прямой&nbsp;<tex>\mathbb{R}</tex>.
 +
Предполагается, что [[случайная величина|случайная величина]]
 +
[[функция распределения|распределена]]
 +
[[семейство экспоненциальных распределений|нормально]] с нулевым матожиданием и
 +
фиксированной дисперсией&nbsp;<tex>\sigma²_\varepsilon</tex>, которая не зависит от переменных&nbsp;<tex>x, y</tex>.
 +
При таких предположениях параметры&nbsp;<tex>\mathbf{w}</tex> регрессионной модели вычисляются с помощью
 +
[[метод наименьших квадратов|метода наименьших квадратов]].
 +
Например, требуется построить зависимость цены нарезного хлеба от времени.
 +
В [[Media:bread_narez_norm.doc|таблице регрессионной выборки]] первая колонка&nbsp;— зависимая переменная (цена батона хлеба),
 +
вторая&nbsp;— свободная (время). Всего данные содержат&nbsp;195 пар значений переменных. Данные нормированы.
-
== Постановка задачи ==
+
== Одномерная регрессия ==
 +
Определим модель зависимости как
 +
<center><tex>y_i= w_1 + w_2x_i + \varepsilon_i.</tex></center>
 +
Согласно методу наименьших квадратов, искомый
 +
вектор параметров&nbsp;<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>&nbsp;— вектор, состоящий из значений зависимой переменной,
 +
<tex>\mathbf{y}=(y_1,\ldots, y_m)</tex>.
 +
Столбцы матрицы&nbsp;<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&nbsp;— 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]]
 +
 
 +
== Полиномиальная регрессия ==
 +
Пусть регрессионная модель&nbsp;— полином заданной степени&nbsp;<tex>p</tex>,
 +
<center><tex>y_i= \sum_{j=1}^p w_j x_i^{j-1} + \varepsilon_i.</tex></center>
 +
Матрица&nbsp;<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>
 +
Одномерная регрессия&nbsp;— частный случай полиномиальной регрессии.
 +
 
 +
Пример нахождения параметров модели и восстановления полиномиальной регрессии.
 +
<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]]
 +
 
 +
== Криволинейная регрессия ==
 +
 
 +
Пусть исходные признаки преобразованы с помощью некоторых заданных, в общем случае нелинейных
 +
функций&nbsp;<tex>g_1,\ldots, g_n</tex>. При этом функции не должны содержать дополнительных
 +
параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на
 +
всех значениях, которые принимает свободная переменная.
 +
%
 +
Матрица&nbsp;<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>
 +
Полиномиальная регрессия&nbsp;— частный случай криволинейной регрессии.
 +
 
 +
Пример нахождения параметров модели и восстановления криволинейной регрессии.
 +
<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>
== Смотри также ==
== Смотри также ==
-
* Этот материал в файле pdf (пока не загружен)
 
-
* [[Регрессионный анализ]]
 
* [[Метод наименьших квадратов]]
* [[Метод наименьших квадратов]]
 +
* [[Регрессионный анализ]]
 +
* [[Media:wiki_linear_regression_example.pdf|Эта статья в формате PDF]]
 +
 +
== Литература ==
 +
* Дрейпер Н., Смит Г. Прикладной регрессионный анализ. Издательский дом «Вильямс». 2007. 912&nbsp;с.
 +
* Стрижов В. В. Методы индуктивного порождения регрессионных моделей. М.: ВЦ РАН. 2008. 55&nbsp;с. [[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

Линейная регрессия — метод восстановления зависимости между двумя переменными. Ниже приведен пример программы, которая строит линейную модель зависимости по заданной выборке и показывает результат на графике.

Для заданного множества из m пар (x_i, y_i), i=1,\ldots, m, значений свободной и зависимой переменной требуется построить зависимость. Назначена линейная модель

y_i= f(\mathbf{w},x_i) + \varepsilon_i

c аддитивной случайной величиной \varepsilon. Переменные x, y принимают значения на числовой прямой \mathbb{R}. Предполагается, что случайная величина распределена нормально с нулевым матожиданием и фиксированной дисперсией \sigma²_\varepsilon, которая не зависит от переменных x, y. При таких предположениях параметры \mathbf{w} регрессионной модели вычисляются с помощью метода наименьших квадратов.

Например, требуется построить зависимость цены нарезного хлеба от времени. В таблице регрессионной выборки первая колонка — зависимая переменная (цена батона хлеба), вторая — свободная (время). Всего данные содержат 195 пар значений переменных. Данные нормированы.

Содержание

Одномерная регрессия

Определим модель зависимости как

y_i= w_1 + w_2x_i + \varepsilon_i.

Согласно методу наименьших квадратов, искомый вектор параметров \mathbf{w}=(w_1,w_2)^T есть решение нормального уравнения

\mathbf{w} = (A^TA)^{-1}A^T\mathbf{y},

где \mathbf{y} — вектор, состоящий из значений зависимой переменной, \mathbf{y}=(y_1,\ldots, y_m). Столбцы матрицы A есть подстановки значений свободной переменной x_i^0\mapsto a_{i1} и x_i^1\mapsto a_{i2}, i=1,\ldots, m. Матрица имеет вид

A =\left(\begin{array}{cc} 1 & x_1\\ 1 & x_2\\ \ldots & \ldots \\ 1 & x_m\\ \end{array} \right).

Зависимая переменная восстанавливается по полученным весам и заданным значениям свободной переменной

y^*_i = w_1+w_2x_i,

иначе

\mathbf{y}^* = A\mathbf{w}.

% Для оценки качества модели используется критерий суммы квадратов регрессионных остатков, SSE — Sum of Squared Errors.

SSE = \sum_{i=1}^m(y_i-y_i^*)² = (\mathbf{y} — \mathbf{y}^*)^T(\mathbf{y} — \mathbf{y}^*).

Пример нахождения параметров модели и восстановления линейной регрессии.

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            % подсчитать ошибку

Полиномиальная регрессия

Пусть регрессионная модель — полином заданной степени p,

y_i= \sum_{j=1}^p w_j x_i^{j-1} + \varepsilon_i.

Матрица A в случае полиномиальной регрессии называется матрицей Вандермонда и принимает вид

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).

Одномерная регрессия — частный случай полиномиальной регрессии.

Пример нахождения параметров модели и восстановления полиномиальной регрессии.

% функция для построения матрицы подстановок
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            % подсчитать ошибку

Криволинейная регрессия

Пусть исходные признаки преобразованы с помощью некоторых заданных, в общем случае нелинейных функций g_1,\ldots, g_n. При этом функции не должны содержать дополнительных параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на всех значениях, которые принимает свободная переменная. % Матрица A в случае полиномиальной регрессии называется обобщенной матрицей Вандермонда и принимает вид

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).

Полиномиальная регрессия — частный случай криволинейной регрессии.

Пример нахождения параметров модели и восстановления криволинейной регрессии.

% функция для построения матрицы подстановок
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.

Исходный код

Личные инструменты