2016-12-23 46 views
3

カーブフィッティングを試したときに、xの配列に対する(f1(x)、f2(x))の形式のベクトル関数をpythonがどのように評価するかという問題があります。scipyのcurve_fitのベクトル関数を正しく定義するには

import numpy as np 
from scipy.optimize import curve_fit 

def func(x,a,b,c): 
    return np.array([a*x**b+c,a*x**b+c+1]) 

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float) 
xdata=np.array([1,2,3,4], dtype=float) 
popt,pcov = curve_fit(func, xdata, ydata) 

"はとValueErrorを:オペランドが(4,2)の形状(2,4)と一緒に放送することができませんでした" を与える が嵌合するデータを転置:

ydata=np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float).transpose() 

「はTypeError例外を与える:不適切な入力:N = 3はM = 2 "を超えてはいけません。なぜなら、パラメータよりも関数値が少なくなったからです。さて、なぜ私はそれに合っていないのですか。だから私は、関数の値を転置する必要があります。

def func(x,a,b,c): 
    return np.array([a*x**b+c,a*x**b+c+1]).transpose() 

これが私に与え、「関数呼び出しからの検索結果をfloatの適切な配列ではありません。」

このような問題を解決するにはどうすればよいですか?数学的には、データがモデルに適合できるかどうかは、十分に決定されるべきです。

+0

[関連質問(http://stackoverflow.com/questions/41090791/how-do-i-optimize-and-find-the-coefficients- for two-equations-simultane-in) – Stelios

+0

また、私の答えに興味があるかもしれません:http://stackoverflow.com/questions/40829791/fitting-a-vector-function-with-curve-fit-in-scipy/40961491#40961491 – tBuLi

答えて

3

curve_fitoutputは1Dの配列を返すので、funcは、flattendにする必要があります。この場合、ydata.T.ravel()curve_fitに入力して、func(x,a,b,c)の要素として正しい順序を持つ必要があります。

import numpy as np 
from scipy.optimize import curve_fit 

def func(x,a,b,c): 
    output = np.array([a*(x**b)+c,a*(x**b)+c+1]) 
    return output.ravel() 

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float) 
xdata=np.array([1,2,3,4], dtype=float) 
popt,pcov = curve_fit(func, xdata, ydata.T.ravel()) 
# print (popt) 
# [ 2., 1., -1.] 

テスト結果、

func(xdata,*popt).reshape(-1,len(xdata)).T 
# [[ 1., 2.], 
# [ 3., 4.], 
# [ 5., 6.], 
# [ 7., 8.]] 
関連する問題