2016-05-26 99 views
0

我正在寻找一种更好的方式来使用SciPy的的我目前用它来适应参数的线性组合curve_fit()创建拟合函数与SciPy的变化Python中的参数个数更好的办法curve_fit

和矢量x 。

例如,这里是一个拟合函数我通过用于与5点的参数尝试配合,M0-M4:

def degFour(x, m0, m1, m2, m3, m4): 
    return x[0]*m0 + x[1]*m1 + x[2]*m2 + x[3]*m3 + x[4]*m4 

我已经作出多种这些起来使用相同的图案degTen。它也可以工作。

我的X矢量:

[[ 1.   1.   1.   1.   1.  ] 
[ 1.   0.99990931 0.99963727 0.99918392 0.99854935] 
[ 1.   0.94872591 0.80016169 0.56954235 0.28051747] 
[ 1.   0.84717487 0.43541052 -0.10943716 -0.62083535] 
[ 1.   0.77991807 0.21654439 -0.44214431 -0.90621706] 
[ 1.   0.73162055 0.07053725 -0.62840754 -0.99004899] 
[ 1.   0.68866877 -0.05147065 -0.75956123 -0.99470154] 
[ 1.   0.64892616 -0.15778967 -0.85371386 -0.95020484] 
[ 1.   0.6114128 -0.25234877 -0.91999134 -0.8726402 ] 
[ 1.   0.57600247 -0.33644232 -0.96358568 -0.77361313] 
[ 1.   0.54225052 -0.41192874 -0.98898767 -0.66062942] 
[ 1.   0.29541145 -0.82546415 -0.78311458 0.36278212] 
[ 1.   0.09546594 -0.98177251 -0.28291761 0.92775452] 
[ 1.   -0.07539697 -0.9886306 0.22447646 0.95478091] 
[ 1.   -0.22050008 -0.90275943 0.61861713 0.62994918] 
[ 1.   -0.33964821 -0.76927818 0.86221613 0.18357784] 
[ 1.   -0.54483185 -0.40631651 0.9875802 -0.66981378] 
[ 1.   -0.71937092 0.03498904 0.66903073 -0.99755153] 
[ 1.   -1.   1.   -1.   1.  ]] 

我的Y数据:

[ 3.50032 3.5007 3.6328 3.94564 4.12814 4.2651 4.39586 
    4.51982 4.64394 4.76738 4.88654 5.90314 6.93304 7.99074 
    9.04278 10.02426 12.01392 14.0592 18.1689 ] 

使用curve_fit(degFour,xdata.T,YDATA),我得到正确的系数:

[ 9.14562709 -7.05004692 1.66932215 -0.27868686 0.02097462] 

我根据度数重新创建x数据,所以我会始终传递正确形状的数据。

我试着版本的fbstj's answer关于变量输入参数。

我用这个:

def vararg(x, *args): 
    return sum(a * x[i] for i, a in enumerate(args)) 

,并结束了与此:

Traceback (most recent call last): 
    File "D:/Libraries/Desktop/PScratch2/vararg.py", line 18, in <module> 
    print(curve_fit(vararg, deg4kary.T, deg4ydata)) 
    File "C:\Python35\lib\site-packages\scipy\optimize\minpack.py", line 606, in curve_fit 
    raise ValueError("Unable to determine number of fit parameters.") 
ValueError: Unable to determine number of fit parameters. 

你可以从跟踪看,我刚刚通过函数本身。我被卡住了。

+0

您是否尝试过使用样条曲线? –

+0

我在这里展示的这些数据是更大集合的一部分。该集合被分解成子集并进行拟合。结果拟合及其一阶导数必须分段连续。还有其他的事情在发挥,但据我所知,我必须使用这种方法。 – Chris

+1

三次样条的定义是具有分段连续一阶导数的立方分段连续插值函数。我会尝试使用'scipy.interpolate.InterpolatedUnivariateSpline'。 [文档](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline。html) –

回答

2

您正在为数据拟合一个多元线性模型。这可以表示为您x向量之间的点积,用形状(npoints, nparams),和系数的一个(nparams,)向量,说m

def linear(x, m): 
    return x.dot(m) 

x = np.random.randn(100, 5) 
m = np.random.randn(5) 

y = linear(x, m) 

真的没有必要使用curve_fit得到m系数 - 它更简单和更有效地使用np.linalg.lstsq求解线性系统如此:

m_hat, residuals, rank, singular_vals = np.linalg.lstsq(x, y) 

这里,m_hat将是包含0的最小二乘估计的(n_params,)矢量,m1,m2等。这将适用于任何数量的系数。

+0

您的答案肯定比我之前实现的更优雅,但我在使用它时遇到了问题。例如,我从两组值开始,这两个值都是(m,),然后从独立变量创建一个线性映射到名为k的范围[-1,1]。 然后我创建一个数组(m,n),其中n + 1是我希望使用的系数的数目,coeff_n = [0,n]。数组值是cos(coeff_n * arccos(k))。这些列是基本向量,第一个是所有的列。第二个是K等 鉴于此设置,我将如何使用您的方法?谢谢。 – Chris

相关问题