【问题标题】:Matlab: How to solve curve fittingMatlab:如何解决曲线拟合
【发布时间】:2012-08-25 04:23:18
【问题描述】:

我尝试使用函数 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 以在这种情况下(和一般情况下)令人满意地拟合?

谢谢!

【问题讨论】:

    标签: matlab curve-fitting


    【解决方案1】:

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

    【讨论】:

    • 感谢您注意到 M 问题 - 这实际上导致了错误。
    • 是的,我认为这将是一个问题。看起来像是单位问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多