MATLAB: линейная регрессия - PullRequest
4 голосов
/ 16 февраля 2012

Я пытаюсь найти наиболее эффективный метод, чтобы найти уравнение линейной регрессии (y = mx + c) для набора данных с массивом 2 на n.

По сути, я хочу знать, каково значение Y, когда X составляет, например, 50.

Мой текущий метод оставляет желать лучшего:

inputData - это мой массив размером 2 на n, с X в первом столбце и Y во втором.

x = 50

for i = 1 : size(inputData,1) % for every line in the inputData array
    if (inputData(i,1) < x + 5) | (inputData(i,1) > x - 5) % if we're within 5 of the specified X value
         arrayOfCloseYValues(i) = inputData(i, 2); % add the other position to the array
    end
end
y = mean(arrayOfCloseYValues) % take the mean to find Y

Как видите, мой метод, описанный выше, просто пытается найти значения Y, которые находятся в пределах 5 от заданного значения X, и получает среднее значение. Это ужасный метод, плюс для его обработки требуется совсем много времени.

Что мне действительно нужно, так это надежный метод расчета линейной регрессии для X и Y, чтобы я мог найти значение с помощью уравнения y = mx + c ...

PS. В моем методе выше я фактически предварительно выделяю память и удаляю конечные нули в конце, но я удалил эту часть для простоты.

1 Ответ

4 голосов
/ 16 февраля 2012

Полифит в порядке, но я думаю, что ваша проблема немного проще. У вас есть 2 x n массив данных. Допустим, столбец 1 - это y, а столбец 2 - x, тогда:

y = inputData(:,1);
x = inputData(:,2);
b = ones(size(inputData));
A = [x b];
c = A\y

Должен дать вам регрессию наименьших квадратов для наклона и смещения.

Вот еще один способ проверить это:

x = transpose(0:10);
y = 0.5*x + 1 + 0.1*randn(size(x)); % as a test, m = 0.5, b=1, and add some noise
A = [x ones(size(x))];
c = A\y;
yest = c(1)*x + c(2);
plot(x,yest,x,y)
legend('y_{est}','y')

Должен получить вас: Estimated Y v Actual Y

...