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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Исходный код)
Строка 209: Строка 209:
[[Категория:Регрессионный анализ]]
[[Категория:Регрессионный анализ]]
[[Категория:Популярные и обзорные статьи]]
[[Категория:Популярные и обзорные статьи]]
 +
[[Категория:Библиотеки алгоритмов]]

Версия 15:34, 28 октября 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^2_\varepsilon, которая не зависит от переменных x, y. При таких предположениях параметры \mathbf{w} регрессионной модели вычисляются с помощью метода наименьших квадратов.

Например, требуется построить зависимость цены нарезного хлеба от времени. (См. рис. далее по тексту). В таблице регрессионной выборки первая колонка — зависимая переменная y (цена батона хлеба), вторая — свободная переменная x (время). Всего данные содержат 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^*)^2 = (\mathbf{y}-\mathbf{y}^*)^T(\mathbf{y}-\mathbf{y}^*).

Пример нахождения параметров модели и восстановления линейной регрессии (здесь и далее код на языке 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            % подсчитать ошибку

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

Пусть регрессионная модель — полином заданной степени 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^2 & \ldots & x_1^p\\ 1 & x_2 & x_2^2 & \ldots & x_2^p\\ \ldots & \ldots & \ldots & \ldots\\ 1 & x_m & x_m^2 & \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.

Исходный код

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