Tengo un conjunto de datos (dado a continuación en mi código MATLAB) y vs x y mi objetivo final es ajustarlo a una ley de potencia $y=ax^b$ para ver qué exponente $b$ Lo entiendo. Hice un ajuste de mínimos cuadrados no lineales y como NLLSF requiere condiciones iniciales especifiqué $b_0=10$ ya que ese era el valor esperado. Me di cuenta de que después de la instalación, $b=b_0=10$ era idéntico. No cambia en absoluto. Luego hice esto para varios valores $b_0$ entre cinco y quince y cada vez $b$ no cambia. Permanece idéntico a su valor inicial, lo cual es un poco molesto porque queremos saber cuál es el exponente. $a$ por otro lado parece converger a los mismos valores independientemente de lo que $a_0$ es.
Lo siento si esto se hace demasiado largo, pero aquí presento todo lo que he hecho.
En esta primera figura, el panel superior es el gráfico de los datos. El segundo panel son los datos (en azul) en una escala logarítmica para mostrar lo bien que deberían ajustarse a una línea de potencia. El conjunto de datos es definitivamente lineal, así que no estoy intentando ajustar algo sin sentido. Sólo por diversión, hice un ajuste lineal por mínimos cuadrados en el espacio logarítmico (en rojo) y obtuve una pendiente de 7,568 y un valor de $r^2=0.998$ lo que indica un ajuste excelente.
Entonces empecé a hacer ajustes de mínimos cuadrados no lineales en los datos. Fijé $a_0=1$ porque no parece importar. Me pasa lo mismo $a$ valores pase lo que pase. Y luego varié $b_0$ entre cinco y quince años y he aquí el resumen de los resultados.
El panel superior muestra lo que $a$ sale a por varios $b_0$ . El segundo panel muestra lo que $b$ converge a para varios $b_0$ . $b_0$ incrementos en pasos de 0,1 y en todos los casos, $b$ no cambia en absoluto. Se mantiene en su valor inicial. El tercer panel muestra $r^2$ para varios $b_0$ así que al menos la primera mitad de los ajustes son buenos, con un pico en torno al $b_0=8$ .
Así que mi pregunta es, ¿qué está pasando aquí? ¿Qué tiene de "especial" este conjunto de datos? Esto me resulta demasiado extraño como para habérmelo inventado yo. Sólo dispongo de esos seis puntos de datos, no más, así que no puedo repetir el experimento ni añadir más puntos de datos. Me parece que el espacio residual en $b$ es muy plana. Lo que sea $b_0$ que elijas, el algoritmo simplemente se queda ahí y no se mueve, pero luego por una variedad de $b_0$ también consigues un buen ajuste. ¿Cómo es posible? ¿Cómo pueden todos los exponentes entre cinco y diez digamos TODOS encajar tan bien?
¿Hay alguna forma de averiguar ese exponente? ¿Estoy condenado a hacer un ajuste lineal en el espacio logarítmico y tomar la pendiente como exponente? ¿Tiene algo que ver con el pequeño número de (seis) puntos de datos aquí? Al igual que intentar ajustar un polinomio de séptimo grado a seis puntos dará como resultado que muchos polinomios se ajusten bien. ¿Es común este fenómeno? ¿Está bien conocido o estudiado? Cualquier buena referencia también será apreciada. Gracias a todos de antemano.
También estoy pegando mi código en MATLAB en caso de que alguien quiere ver exactamente lo que estoy haciendo.
close all
clc
clear all
% The data hardcoded
x = 4:0.5:6.5;
y = 1.0e-04 * [0.011929047861902, 0.026053683604530, 0.057223759612162,...
0.117413370572612, 0.242357468772138, 0.462327165034928];
%The data plot
figure('units','normalized','position',[0 0 1 1])
% Shows the data as it is
subplot(2,1,1)
plot(x,y,'-o')
title('The Data y vs. x to be fitted')
xlabel('x');ylabel('y')
% Shows the data on a log log scale to see how well it should fit a power
% law
subplot(2,1,2)
loglog(x,y,'-o')
hold on
title('The Data y vs. x to be fitted on a log-log scale')
xlabel('x');ylabel('y')
% LLSF in log-log space to see how well it should fit a power law
ft = fittype('poly1');
opts = fitoptions(ft);
[fitresult, gof] = fit( log(x'), log(y'), ft)
loglog(x,exp(fitresult.p2)*x.^fitresult.p1,'-r')
hold off
% Will hold the results for various initial b values
fitresultarray=[];
binit = 5:0.1:15;
% NLLSF for various initial b-values are performed and saved
for counter = 1:length(binit)
ft = fittype( 'power1' );
opts = fitoptions( ft );
opts.Display = 'Off';
opts.Lower = [-Inf -Inf];
opts.StartPoint = [1 binit(counter)];
opts.Upper = [Inf Inf];
[fitresult, gof] = fit(x',y',ft,opts);
fitresultarray = [fitresultarray; fitresult.a fitresult.b gof.rsquare];
end
%fitresultarray
% The results of the fits are plotted
figure('units','normalized','position',[0 0 1 1])
subplot(3,1,1)
plot(binit,fitresultarray(:,1),'-o')
title('Nonlinear Least Squares Fitting y vs. x with Fitting Form y=ax^b')
xlabel('b initial');ylabel('a');
subplot(3,1,2)
plot(binit,fitresultarray(:,2),'-o')
xlabel('b initial');ylabel('b');
subplot(3,1,3)
plot(binit,fitresultarray(:,3),'-o')
xlabel('b initial');ylabel('Goodness of fit r^2');