Линейная регрессия (пример)
Материал из 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.