Можно ли заставить два компонента в трехсторонней линейной регрессии быть положительными? - PullRequest
1 голос
/ 20 февраля 2009

Извините, если я не использую правильные математические термины, но надеюсь, вы поймете, чего я пытаюсь достичь.

Моя проблема: Я использую линейную регрессию (в настоящее время метод наименьших квадратов) для значений из двух векторов x и y против результата z. Это должно быть сделано в Matlab, и я использую \ -оператор для выполнения регрессии. Мой набор данных будет содержать несколько тысяч наблюдений (максимум до 50000).

Значения x будут в области 10-300 (чаще всего между 60 и 100), а значения y - в области 1-3.

Мой код выглядит так:

X = [ones(size(x,1) x y];
parameters = X\y;

Выходными «параметрами» являются три фактора a0, a1 и a2, которые используются в этой формуле:

a0 * 1 + a1 * xi + a2 * yi = zi

(я должен быть подписан)

Это работает, как и ожидалось, хотя я хочу, чтобы два параметра a1 и a2 всегда были положительными значениями, даже когда вектор z отрицательный (это означает, что a0, конечно, будет отрицательным), поскольку это то, Модель выглядит так (z всегда положительно коррелирует с x и z). Возможно ли это с помощью метода наименьших квадратов? Я также открыт для других алгоритмов линейной регрессии.

Ответы [ 2 ]

1 голос
/ 31 марта 2009

Простым решением является использование инструмента, предназначенного для его решения. То есть используйте lsqlin из панели инструментов оптимизации. Установите ограничение нижней границы для двух из трех параметров.

Таким образом, предполагая, что x, y и z - все векторы COLUMN,

A = [единицы (длина (x), 1), x, y];

фунт = [-inf, 0, 0];

a = lsqlin (A, z, [], [], [], [], lb);

Это ограничит только второй и третий неизвестные параметры.

Без набора инструментов оптимизации используйте lsqnonneg, который является частью самого matlab. Здесь также достаточно простое решение.

A = [единицы (длина (x), 1), x, y];

a = lsqnonneg (A, z);

Ваша модель будет

z = a (1) + a (2) * x + a (3) * y

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

A (:, 1) = -1;

a = lsqnonneg (A, z);

Если это решение имеет (1) существенно ненулевое значение, то второе решение должно быть лучше первого. Ваша модель теперь будет

z = -a (1) + a (2) * x + a (3) * y

Это стоит не более двух звонков в lsqnonneg, и второй звонок совершается только в некоторой доле (при отсутствии какой-либо информации о вашей проблеме шансы составляют 50% второго звонка) времени.

1 голос
/ 20 февраля 2009

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

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

В этом случае правильное решение, как говорит jpalacek , но объяснено более подробно здесь:

  1. Попробуйте регрессировать против x и y. Если оба положительных результата берут результат.
  2. Если a1 отрицательно, предположим, что оно должно быть нулем. регресс z против y. Если a2 положительно, тогда a1 принимают за 0, а a0 и a2 из этой регрессии.
  3. Если a2 отрицательно, предположим, что оно также должно быть равно нулю. Регресс z против 1, и принять это как a0. Пусть a1 и a2 равны 0.

Это должно дать вам то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...