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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Криволинейная регрессия)
Строка 85: Строка 85:
параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на
параметров. Функции должны быть определены на всей числовой прямой, либо, по крайней мере, на
всех значениях, которые принимает свободная переменная.
всех значениях, которые принимает свободная переменная.
-
%
+
 
Матрица&nbsp;<tex>A</tex> в случае полиномиальной регрессии называется обобщенной матрицей Вандермонда и
Матрица&nbsp;<tex>A</tex> в случае полиномиальной регрессии называется обобщенной матрицей Вандермонда и
принимает вид
принимает вид

Версия 11:12, 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.

Исходный код

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