Метод наименьших квадратов для подбора параметров

Меня просят использовать метод наименьших квадратов, чтобы подогнать параметры α и β к y = α*exp(-β*x),

учитывая баллы:

x = [1 2 3 4 5 6 7]
y = [9 6 4 2 4 6 9]

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

ln_y = [2.19 1.79 1.39 0.69 1.39 1.79 2.19]

Однако как должна выглядеть моя матрица, потому что у меня осталось ln(y) = ln(α) - β*x?

Итак, столбец состоит из единиц, а столбец x будет моими x значениями, но что должен содержать столбец α?

Это то, что я предполагаю, что я должен получить:

A = [1 1 1 1 1 1 1; 1 2 3 4 5 6 7]

Я правильно мыслю?


person P.ython    schedule 05.12.2018    source источник
comment
Почему вы пытаетесь сопоставить свои экспериментальные данные с этой функцией? Это совсем не похоже на экспоненциальную функцию. Кстати, вы можете использовать lsqnonlin.   -  person obchardon    schedule 06.12.2018


Ответы (3)


Первое, что мы можем сделать, это взять натуральный логарифм ln (log в Matlab)) с обеих сторон уравнения:

y = α * e^(-β * x)

становится:

ln(y) = ln(α * e^(-β * x))
// Law of logarithms
ln(x * y) = ln(x) + ln(y) 

// thus:
ln(y) = ln(α) + ln(e^(-β * x))
Simplifying:
ln(y) = -β * x + ln(α)

Теперь у нас есть ln(y) как линейная функция x, и проблема сводится к нахождению линейной регрессии в смысле наименьших квадратов. Давайте определим lny = log(y) и A = ln(α), и мы можем переписать задачу как

lny = -β * x + A

Где

x = [1 2 3 4 5 6 7]
lny = [2.19 1.79 1.39 0.69 1.39 1.79 2.19]

Для каждого x_i в x мы можем оценить lny следующим образом (переписано в возрастающей степени x):

lny(x1) = A - β * x1
lny(x2) = A - β * x2
...
lny(xn) = A - β * xn

В матричной форме

LNY = X * [A β]'
Or,
X * [A β]' = LNY
// let Coefs = [A β]'
Coefs = X^-1 * LNY

В Matlab

x = [1 2 3 4 5 6 7];
y = [9 6 4 2 4 6 9];
lny = log(y);
X = [ones(length(y), 1), -x']; % design matrix
coefs = X\lny'
% A = coefs(1) and β = coefs(2)
% ln(α) = A thus α = exp(A)
alpha = exp(coefs(1));
beta = coefs(2)
person StaticBeagle    schedule 06.12.2018

У тебя почти получилось. Вторая строка должна быть -x.

x = [1 2 3 4 5 6 7]
y = [9 6 4 2 4 6 9]

logy = log(y)

n = length(x);
A = [ones(1,n); -x]

c = logy/A; %Solve for coefficients

alpha = exp(c(1))
beta = c(2);
person Savithru    schedule 06.12.2018

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

Существует быстрый и грязный подход, гибкий и удобный.

Просто численно. Вы можете использовать fminsearch чтобы выполнить задание.

% MATLAB R2019a
x = [1 2 3 4 5 6 7];
y = [9 6 4 2 4 6 9];

% Create anonymous function (your supposed model to fit)
fh =@(params) params(1).*exp(-params(2).*x);

% Create anonymous function for Least Squares Error with single input
SSEh =@(params) sum((fh(params)-y).^2);     % Sum of Squared Error (SSE)

p0 = [1 0.5];                   % Initial guess for [alpha, beta]
[p, SSE] = fminsearch(SSEh,p0);
alpha = p(1);           % 5.7143
beta = p(2);            % 1.2366e-08  (AKA zero)

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

yhath=@(params,xval) params(1).*exp(-params(2).*xval);

Xrng = min(x)-1:.2:max(x)+1;
figure, hold on, box on
plot(Xrng,p(1).*exp(-p(2).*Xrng),'r--','DisplayName','Fit')
plot(x,y,'ks','DisplayName','Data')
legend('show')

Примечание о нелинейности.
Это прекрасно работает с линейными моделями из-за
< strong>выпуклость. Если ваша функция ошибок нелинейна, но выпукла, как сумма квадратов ошибок (SSE), то это также возвращает глобальный оптимум.

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

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

% Create anonymous function for Least Absolute Error with single input
SAEh =@(params) sum(abs(fh(params)-y));     % Sum of Absolute Error
person SecretAgentMan    schedule 21.11.2019