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」メソッドはムーアペンローズ擬似逆行列を使用して共分散を計算しますマトリックス。
それで、根本的な問題は何ですか?解のヤコビ行列が完全なランクを持たないのはなぜですか?
パラメーターの共分散の式( Wikipedia )には、分母に自由度の数があります。自由度は、(データポイントの数) パラメーターの数)として計算されます。これは、この例では1-1 = 0です。そして---(this は、SciPyが分割する前に自由度の数をチェックする場所です。
xdata = [1, 2], ydata = [1, 2]
共分散がゼロになります(モデルは依然として正確に適合していることに注意してください。正確な適合は問題ではありません)。
これは、サンプルサイズNが1の場合にサンプル分散が未定義であるのと同じ種類の問題です(サンプル分散の式の分母には(N-1)があります)。母集団からsize = 1サンプルのみを取得した場合、分散をゼロで推定せず、分散については何も知りません。