0

我尝试使用函数 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 不相似:

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

谢谢!

在此处输入图像描述

4

1 回答 1

5

看在上帝的份上,为什么不使用简单的线性回归呢?:) 对此进行非线性拟合就像使用 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 时会发生什么。所以如果有问题不要惊讶,你跑回来告诉我们有问题。我已经预料到你搞砸了。我猜这就是你之前身体不好的原因。

于 2012-08-24T20:23:18.350 回答