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时会发生什么.所以如果有问题就不要感到惊讶,然后你跑回来,告诉我们有一个问题.我已经预料到你已经搞砸了.我猜这就是为什么你以前身体不好的原因.