Matlab:如何解决曲线拟合问题

Nik*_*lin 0 matlab curve-fitting

我尝试使用函数lsqcurvefit来查找Bass Diffusion Model的 p和q参数.

起初我用以下方式编写了Bass函数:

function F = Bass(x, cummulativeAdoptersBefore)
m = 1500000;

F = x(1)*m + (x(2)-x(1))*cummulativeAdoptersBefore + x(2)/m*cummulativeAdoptersBefore.^2;
end
Run Code Online (Sandbox Code Playgroud)

x(1)= p x(2)= q

然后是FitBass:

function [ x, resnorm ] = FitBass(priorCumulativeAdopters, currentAdoptersCount)

    xData = priorCumulativeAdopters;
yData = currentAdoptersCount;
x0 = [0.08; 0.41];
[x, resnorm] = lsqcurvefit(@Bass, x0, xData, yData);
end
Run Code Online (Sandbox Code Playgroud)

但相比的结果F =贝斯(X,cummulativeAdoptersBefore),其中x是匹配的参数的向量和YDATA这是实际数据的情况下,我注意到,F(下部曲线 - X〜1)甚至不类似于YDATA:

在这种情况下(以及一般情况下),anayone是否知道这里可能存在什么问题或如何找到参数x以获得满意的拟合?

谢谢!

在此输入图像描述

小智 5

为了gawds的缘故,为什么不使用简单的线性回归?:)在这种情况下投入非线性适合就像使用Mack卡车将豌豆带到波士顿.这是一个简单的二次多项式.

n(t) = pM + (q-p) N(t) -q/M (N(t))^2
Run Code Online (Sandbox Code Playgroud)

结合条款.

n(t) = p*(M - N(t)) + q*(N(t)-(N(t))^2/M)
Run Code Online (Sandbox Code Playgroud)

看到p和q是线性可估计系数.假设您的数据属于一对列向量,请像这样求解p和q ...

N = priorCumulativeAdopters;
m = 1500000;
pq = [M-N, N - N.^2/M]\currentAdoptersCount;
Run Code Online (Sandbox Code Playgroud)

pq将是长度为2的列向量.

话虽如此,期望看到潜在的数字问题,因为似乎存在扩展问题.

M是1.5e6,并且priorCumulativeAdopters的向量似乎在0到16的区间内缩放.看看当你从M中减去N时会发生什么.所以如果有问题就不要感到惊讶,然后你跑回来,告诉我们有一个问题.我已经预料到你已经搞砸了.我猜这就是为什么你以前身体不好的原因.