Нелинейная регрессия дает разные результаты для каждого прогона - PullRequest
0 голосов
/ 16 октября 2019

Я пытался подогнать степенное распределение: ns ~ s^-a (where ns is the probability density function; s is the empirical observation; and a is the scaling exponent) к моим эмпирическим данным (см. Ссылку), используя функцию подбора MATLAB. Однако у меня возникают проблемы с получением воспроизводимого решения. Когда я не указываю начальную точку, я получаю разные результаты для каждого запуска - несмотря на то, что я использую один и тот же набор данных. Затем, когда я указываю начальную точку, функция дает мне тот же результат, что и указанная начальная точка. Кроме того, проблема остается независимо от того, указываю ли я алгоритм, такой как Levenberg-marquardt, или я использовал алгоритм по умолчанию. Мои коды следующие:

clc; clear; close all;

%%%%%%%%%%%%%%%%%%% Load data
[data, ~, ~] = xlsread('myDataset.xlsx',1,'A:A'); 

%%%%%%%%%%%%%%%%%% Histogram plot 
data = sort(data);
[y, edges] = histcounts(data, 100000, 'Normalization','pdf');
edges = edges(2:end) - (edges(2)-edges(1))/2;
figure;
scatter(edges, y, 4, 'ro', 'Markerfacecolor', 'r');
hold on;
box on;

edges = edges';
y = y';

%%%%%%%%%%%%%%%%%% Specify input parameters
%(1): cut-off value
xmin = 1*10^5; 
%(2): x-values after cut-off
x    = edges(edges>=xmin);
ind  = find(edges>=xmin,1,'first');
%(3): y-values after cut-off
y([1:ind-1]) = [];

%%%%%%%%%%%%%%%%%% fit power-law model
f = fittype('b*x.^-a'); 
fModel = fit(x, y, f, 'Algorithm','levenberg-marquardt'); 
coeffs = coeffvalues(fModel);
plot(fModel,'b--')

set(gca, 'xscale','log', 'yscale','log')
xlabel('s', 'fontsize',8)
ylabel('ns', 'fontsize',8)

Говорят, что значение a около 2.189. Хотя я не могу получить это точное значение - поскольку оно будет зависеть от набора данных, я, тем не менее, рассчитываю получить значения в диапазоне около 1.5 - 2.

Я очень ценю любую помощь, предложения или ссылкиэто будет полезно для решения проблемы. Пожалуйста, смотрите ссылку на следующую ссылку для эмпирических данных. https://gofile.io/?c=EoEW7k

Большое спасибо.

1 Ответ

0 голосов
/ 16 октября 2019

Если вы пытаетесь приспособить ваши данные к распределению степенного закона, y=ax^b, вы должны проверить эту или эту ссылку, поскольку они предоставили решение для закрытой формы дляa и b термины.

Обоснование пригодности уравнений или объяснение «откуда оно» исходит из формул, используемых для получения метода наименьших квадратов, подходящего для линейной регрессии.

Если у вас есть уравнение вида y=ax+b, вы можете найти a и b из линейной регрессии наименьших квадратов. Если у вас есть степенной закон, y=ax^b. записать обе стороны и использовать логарифмические свойства , чтобы получить:

y=ax^blog(y)=log(ax^b)log(y)=log(a)+blog(x)Y=A+BXЛинейное уравнение

Вы можете использовать формулы линейной регрессии для log(x) и log(y), чтобы получить a и b. Это позволяет избежать использования численного метода для получения регрессии нелинейного соответствия.

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

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

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