Я пытался подогнать степенное распределение: 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
Большое спасибо.