web-dev-qa-db-ja.com

パラメータが正確に適合する場合、「curve_fit」がパラメータの共分散を推定できないのはなぜですか?

curve_fitがパラメーターの共分散を推定できないので、以下のOptimizeWarningを上げることができません。次のMCVEは私の問題を説明しています:

MCVE python snippet

from scipy.optimize import curve_fit
func = lambda x, a: a * x
popt, pcov = curve_fit(f = func, xdata = [1], ydata = [1])
print(popt, pcov)

出力

\python-3.4.4\lib\site-packages\scipy\optimize\minpack.py:715:
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)

[ 1.] [[ inf]]

a = 1の場合、関数はxdataおよびydataに正確に適合します。エラー/分散0、または0に近いものではなく、代わりにinfではないのはなぜですか?

curve_fit SciPyリファレンスガイド からこの引用があります:

解のヤコビ行列がフルランクを持たない場合、「lm」メソッドはnp.infで満たされた行列を返しますが、「trf」および「dogbox」メソッドはムーアペンローズ擬似逆行列を使用して共分散を計算しますマトリックス。

それで、根本的な問題は何ですか?解のヤコビ行列が完全なランクを持たないのはなぜですか?

13
finefoot

パラメーターの共分散の式( Wikipedia )には、分母に自由度の数があります。自由度は、(データポイントの数) パラメーターの数)として計算されます。これは、この例では1-1 = 0です。そして---(this は、SciPyが分割する前に自由度の数をチェックする場所です。

xdata = [1, 2], ydata = [1, 2]共分散がゼロになります(モデルは依然として正確に適合していることに注意してください。正確な適合は問題ではありません)。

これは、サンプルサイズNが1の場合にサンプル分散が未定義であるのと同じ種類の問題です(サンプル分散の式の分母には(N-1)があります)。母集団からsize = 1サンプルのみを取得した場合、分散をゼロで推定せず、分散については何も知りません。

13
user6655984