Проблема наименьших квадратов - PullRequest
2 голосов
/ 07 ноября 2010

После сбора данных для моей модели:

y = b (0) + b (1) x (1) + ... + b (i) x (i)

y = Xb, где y - вектор столбцов (n * 1), X - матрица (n * m) и b (m * 1).

Я реализовал решение на python, используя обычные наименьшие квадраты (OLS), чтобы найти b. Моя проблема в том, что мое решение полностью зависит от того, является ли X обратимым. Если X нет, тогда я не могу оценить b, используя OLS.

Есть предложения?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Да, используйте SVD (разложение по сингулярным числам) для решения этой системы уравнений.

0 голосов
/ 09 января 2018

В случае, если кто-то обнаружит это позже, матрица X будет n x m, поэтому никогда не будет обратимой для n, не равного m. Нормальные уравнения для решения OLS будут включать инверсию матрицы X ^ T * X, и, пока X высокий и имеет линейно независимые столбцы, это всегда будет обратимо ( обычно в случае, если у вас есть больше измерений чем переменные для оценки).

В случае, если X ^ T * X не является обратимым, вам придется сделать какое-то упрощающее предположение. Обычно это предположение (грубо говоря), что веса b малы, если нет достаточно данных, чтобы показать обратное. Это захвачено преобразованием проблемы квадратов, чтобы получить

свести к минимуму || Xb - y || ^ 2 + лямбда * || b || ^ 2

где лямбда - положительный скаляр. По существу это наказывает большие значения параметров b. Вы можете, конечно, сделать этот штраф произвольно большим или маленьким, сделав масштабное лямбда. Вместо решения OLS

b_ols = inv (X ^ T * X) * X ^ T * y

Вы можете сделать математику, чтобы найти решение регуляризованной задачи:

b_reg = inv (X ^ T * X + лямбда * I) * X ^ T * y

Матрица всегда будет обратимой для любого положительного значения лямбды. Чтобы найти «хорошее» значение лямбды, вам обычно нужно сделать что-то вроде перекрестной проверки

...