2015-08-26 3 views
1

Я использую функцию regress в MATLAB для множественной линейной регрессии. Ниже приведен пример кода приведены в документации regress:Линейная регрессия в MATLAB и добавление новых функций

load carsmall 
x1 = Weight; 
x2 = Horsepower; % Contains NaN data 
y = MPG; 

X = [ones(size(x1)) x1 x2 x1.*x2]; 
b = regress(y,X) % Removes NaN data 

Я не понимаю, почему они используют ones(size(x1)) и x1.*x2 в приведенном выше коде. Являются ли они первым коэффициентом (бета-ноль) и значением epsilon соответственно модели ниже?

yi = b0 + b1*xi1 + b2*xi2 + ... bp*xip + ei for i = 1,2, ... n 

Если у меня есть более двух функций, например x1, x2, x3, как я могу изменить выше формулу, чтобы объяснить это?

ответ

3

Каждый столбец X является одной из особенностей. В частности, каждый столбец описывает значение xi, а одна строка описывает образец. В частности, каждая строка имеет функции n, где каждый столбец описывает функцию для этого образца.

Причина, по которой вы делаете первый столбец всеми, заключается в том, что это позволит вам иметь термин перехвата в вашей модели. Это позволяет вам иметь предвзятость и не зависит от любых функций, которые вы вставляете. Он также помогает минимизировать ошибку в прогнозировании. В линейной регрессии вы правы в том, что у вас есть модель прогнозирования, которая представляет собой сумму терминов с весами.

В частности, он должен быть

yi = b0*x0 + b1*x1 + b2*x2 + ...bi*xi + ... + bn*xn + ei, for i = 1, 2, ... n 

ei это ошибка, которая вводится для образца, чтобы получить желаемый результат. Линейная регрессия стремится к свести к минимуму ошибку, введенную для каждого образца, так что, когда вы вводите неизвестный вектор/образец функции, результат должен дать вам прогноз с наименьшим количеством ошибок. При использовании regress у вас нет доступа к этому значению, но будьте уверены, что он не нужен и что это значение учитывается в коэффициентах регрессии, чтобы при выполнении предсказания возникала наименьшая ошибка.

Как вы можете видеть, при сравнении с вашим уравнением модель требует, чтобы модель x0 была 1, чтобы разрешить b0 действовать как термин перехвата, поэтому у вас есть первый столбец, поскольку все они являются одними. Теперь причина, по которой все это «линейно», состоит в том, что хотя одна из ваших функций нелинейна, весы bnявляются линейными. В частности, у вас есть три функции, которые вы смотрите:

x1 = Weight 
x2 = Horsepower 
x3 = x1*x2 --> Weight * Horsepower 

Выход даст вам 4 линейных коэффициентов регрессии (в том числе свободного члена), которые говорят вам, сколько веса каждая функция имеет при прогнозировании выхода. Если вы хотите добавить дополнительные функции, вам просто нужно добавить больше столбцов в X, что даст вам больше коэффициентов, которые вы используете, чтобы выполнять регрессию по тестовым данным.

Например, предположим, вы хотели добавить еще две функции: Cylinders и Displacement в матрицу.

Таким образом, все, что вам придется сделать, это:

load carsmall 
x1 = Weight; 
x2 = Horsepower; % Contains NaN data 
x3 = Cylinders; %// New 
x4 = Displacement; %// New 
y = MPG; 

X = [ones(size(x1)) x1 x2 x1.*x2 x3 x4]; %// New 
b = regress(y,X) % Removes NaN data 

b будет содержать коэффициенты, вес каждая функция, так что вы можете использовать это, чтобы предсказать MPG. Чем больше функций у вас есть, тем больше у вас коэффициентов.Будьте осторожны, что введение слишком многих функций может привести к переобучению и, к сожалению, даст вам плохую точность в образце тестовых данных.

Существует тонкая грань между выбором функций, которые вы хотите включить в свою модель, и улучшением точности прогнозирования модели.

+0

спасибо @rayryeng. Итак, x1 * x2 - это еще одна функция, точно так же, как x1 и x2. Два последних вопроса, которые я хочу задать: 1. Почему бы нам просто не использовать x1 * x2? Зачем нам нужна точка между ними как x1. * X2? 2. Что относительно ценности эпсилона? – ZCox

+1

@ZCox - Правильно. 'x1. * x2' - еще одна функция, которая объединяет вес и мощность вместе. Это почти похоже на соотношение мощности и веса, которое вы видите при измерении характеристик автомобиля. – rayryeng

+1

@ZCox (1) Вы используете 'x1. * X2', потому что вы делаете умножение по элементам. Вы берете все образцы 'x1', которые описывают эту функцию и умножают этот векторный элемент на' x2', который является другим вектором. Выполнение 'x1 * x2' является матричным умножением, и это не то, что вы хотите. – rayryeng

Смежные вопросы