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

念のため、単純な線形回帰を使用しないのはなぜですか? :) これに非線形フィットを適用するのは、マック トラックを使ってエンドウ豆をボストンに運ぶようなものです。これは単純な二次多項式です。

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 に答える