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

时间:2012-08-24 19:56:35

标签: 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

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以获得满意的拟合?

谢谢!

enter image description here

1 个答案:

答案 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时会发生什么。所以如果出现问题就不要感到惊讶,并且你来运行回来,告诉我们有问题。我已经预料到你已经搞砸了。我猜这就是为什么你以前身体不好的原因。