我尝试使用函数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
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
但是当比较结果F = Bass(x,cummulativeAdoptersBefore),其中x是匹配参数的矢量而yData是实际数据时,我注意到F(下曲线-x~1)甚至不相似到yData:
在这种情况下(以及一般情况下)anayone是否知道这里可能出现什么问题或者如何找到参数x以获得满意的拟合?
谢谢!
答案 0 :(得分:5)
为了gawds的缘故,为什么不使用简单的线性回归? :)在这种情况下投入非线性适合就像使用Mack卡车将豌豆带到波士顿。这是一个简单的二次多项式。
n(t) = pM + (q-p) N(t) -q/M (N(t))^2
结合条款。
n(t) = p*(M - N(t)) + q*(N(t)-(N(t))^2/M)
看到p和q是线性可估计系数。假设您的数据属于一对列向量,请像这样求解p和q ...
N = priorCumulativeAdopters;
m = 1500000;
pq = [M-N, N - N.^2/M]\currentAdoptersCount;
pq将是长度为2的列向量。
话虽如此,期待看到潜在的数字问题,因为似乎存在扩展问题。
M是1.5e6,priorCumulativeAdopters的向量似乎在0到16的区间内缩放。看看当你从M中减去N时会发生什么。所以如果出现问题就不要感到惊讶,并且你来运行回来,告诉我们有问题。我已经预料到你已经搞砸了。我猜这就是为什么你以前身体不好的原因。