web-dev-qa-db-ja.com

pythonでの多変量curve_fitのフィッティング

単純な関数をPythonの独立したデータの2つの配列に適合させようとしています。独立変数のデータを1つの配列にまとめる必要があることは理解していますが、近似を実行しようとすると、変数を渡す方法にまだ問題があるようです。 (これに関連する以前の投稿が2つありますが、あまり役に立ちませんでした。)

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x_3d, a, b, c, d):
    return a + b*x_3d[0,:] + c*x_3d[1,:] + d*x_3d[0,:]*x_3d[1,:]

x_3d = np.array([[1,2,3],[4,5,6]])

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d[:2,:], x_3d[2,:], p0)
print ' fit coefficients:\n', fitParams

私が読むエラー

raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m)) 
TypeError: Improper input: N=4 must not exceed M=3

Mの長さは? Nの長さはp0?ここで何が悪いのですか?

18
user3133865

NとMは、関数の ヘルプ で定義されています。 Nはデータポイントの数、Mはパラメーターの数です。したがって、エラーは基本的に、少なくともパラメータと同じ数のデータポイントが必要であることを意味します。これは完全に理にかなっています。

このコードは私にとってはうまくいきます:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x, a, b, c, d):
    return a + b*x[0] + c*x[1] + d*x[0]*x[1]

x_3d = np.array([[1,2,3,4,6],[4,5,6,7,8]])

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d, x_3d[1,:], p0)
print ' fit coefficients:\n', fitParams

より多くのデータを含めました。また、fitFuncを変更して、1つのxの関数としてのみスキャンする形式で書き込むように変更しました。フィッターは、すべてのデータポイントに対してこれを呼び出す処理を行います。投稿したコードもx_3d[2,:]を参照していたため、エラーが発生していました。

21
chthonicdaemon