Python ValueError:无法确定拟合参数的数量&引用;“曲线拟合中的问题”;
我是python新手,所以我的知识不足。 我有一个名为“tlove_cc_seq2_k2_NL3.dat”的数据文件。我想用曲线拟合数据。 我使用的代码如下所示: 我得到的错误如下所示: 。。。 ValueError回溯(最近一次调用上次) 在里面 13#y=数据[:,1] 14 plt.绘图(数据_k2_2fl_NL3[:,8],数据_k2_2fl_NL3[:,5],“b-”,标签=“数据”) --->15 popt,pcov=曲线拟合(func,data_k2_2fl_NL3[:,8],data_k2_2fl_NL3[:,5]) 16波普 十七,Python ValueError:无法确定拟合参数的数量&引用;“曲线拟合中的问题”;,python,numpy,Python,Numpy,我是python新手,所以我的知识不足。 我有一个名为“tlove_cc_seq2_k2_NL3.dat”的数据文件。我想用曲线拟合数据。 我使用的代码如下所示: 我得到的错误如下所示: 。。。 ValueError回溯(最近一次调用上次) 在里面 13#y=数据[:,1] 14 plt.绘图(数据_k2_2fl_NL3[:,8],数据_k2_2fl_NL3[:,5],“b-”,标签=“数据”) --->15 popt,pcov=曲线拟合(func,data_k2_2fl_NL3[:,8],
~/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata,
ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
678 args, varargs, varkw, defaults = _getargspec(f)
679 if len(args) < 2:
--> 680 raise ValueError("Unable to determine number of fit parameters.")
681 n = len(args) - 1
682 else:
ValueError: Unable to determine number of fit parameters.
曲线拟合中的/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py(f,扩展数据,
ydata,p0,西格玛,绝对西格玛,检查有限,界限,方法,jac,**kwargs)
678参数,varargs,varkw,默认值=_getargspec(f)
679如果len(args)<2:
-->680 raise VALUE ERROR(“无法确定拟合参数的数量”)
681 n=len(args)-1
682其他:
ValueError:无法确定拟合参数的数量。
我如何解决这个问题?
谢谢。我认为问题在于,
曲线拟合
函数无法通过内省确定参数的数量,因为您要求它拟合的函数(测试
)被包装在np.vectorize
函数中
我尝试了一个最简单的例子,我使用了test
函数未矢量化,它成功了:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def test(x, a, b, c):
return (a + b*np.log(x) + c*np.log(x)**2)
func = np.vectorize(test)
#Create some dummy data
x_data = list(range(1, 11))
y_data = np.log(x_data) + np.log(x_data)**2 + np.random.random(10)
plt.plot(x_data, y_data, 'b-', label='data')
popt, pcov = curve_fit(test, x_data, y_data)
popt
如果出于性能原因需要vectorize
,还可以传递一个参数p0
一个初始参数数组。e、 g:
popt, pcov = curve_fit(func, x_data, y_data, p0=[1,1,1])
似乎您遇到的大多数问题都与使用
numpy
vsmath
有关。为了完整性,并且由于您提到了lmfit
,要使用lmfit
,您可以使用
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
def test(x, a, b, c):
return (a + b*np.log(x) + c*np.log(x)**2)
# create model from your model function
mymodel = Model(test)
# create initial set of named parameters from argument of your function
params = mymodel.make_params(a=0.5, b=1.1, c=0.5)
# Create some dummy data
x_data = np.linspace(1, 10, 10)
y_data = np.log(x_data) + np.log(x_data)**2 + np.random.random(len(x_data))
# run fit, get result
result = mymodel.fit(y_data, params, x=x_data)
# print out full fit report: fit statistics, best-fit values, uncertainties
print(result.fit_report())
# make a stacked plot of residual and data + fit
result.plot()
plt.show()
请注意,curve\u fit()
将愉快地接受未初始化的参数,为所有参数指定无法证明的默认值1。Lmfit不允许这样做,并强制您显式设置初始值。但它也能更好地报告统计数据、不确定性,并允许合成更多的complpex模型
例如,fit报告将如下所示:
[[Model]]
Model(test)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 8
# data points = 10
# variables = 3
chi-square = 0.91573485
reduced chi-square = 0.13081926
Akaike info crit = -17.9061352
Bayesian info crit = -16.9983799
[[Variables]]
a: 0.69752193 +/- 0.34404583 (49.32%) (init = 0.5)
b: 1.17700278 +/- 0.59765274 (50.78%) (init = 1.1)
c: 0.85298657 +/- 0.23838141 (27.95%) (init = 0.5)
[[Correlations]] (unreported correlations are < 0.100)
C(b, c) = -0.961
C(a, b) = -0.782
C(a, c) = 0.607
[[Model]]
模型(试验)
[[Fit统计数据]]
#拟合方法=最小二乘法
#函数evals=8
#数据点=10
#变量=3
卡方检验=0.91573485
缩减卡方=0.13081926
Akaike信息临界值=-17.9061352
贝叶斯信息临界值=-16.9983799
[[变量]]
a:0.69752193+/-0.34404583(49.32%)(初始值=0.5)
b:1.17700278+/-0.59765274(50.78%)(初始值=1.1)
c:0.85298657+/-0.23838141(27.95%)(初始值=0.5)
[[相关性]](未报告的相关性<0.100)
C(b,C)=-0.961
C(a,b)=-0.782
C(a,C)=0.607
还有一个
问题是我需要从数据文件中拟合数据集。当我没有矢量化时,我得到了一个类似“TypeError:只有大小为1的数组才能转换为Python标量”的错误。由于这是在一个数字数组代替单个数字作为输入时生成的,所以我进行了矢量化。主要问题是我需要拟合文件中的数据。您能否尝试使用
np.log
(如我的回答中所示)代替test
函数中的math.log
?numpy方法接受数组。传递初始化向量p0
无效吗?非常感谢,它有效。主要问题是np.log。它需要数组,而math.log不需要。太好了。如果答案解决了您的问题,您可以将其标记为“已接受”,然后其他人知道它已解决。我现在对M Newville的答案进行了投票,因为它显示了lmfit的更好使用。我以前没有用过那个软件包,所以差一点就把错误消除了。听起来他的回答显示了一种更好的使用该软件包的方法。感谢您提供更详细的解释并分享您对lmfit的体验。我以前没用过那个包裹。
[[Model]]
Model(test)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 8
# data points = 10
# variables = 3
chi-square = 0.91573485
reduced chi-square = 0.13081926
Akaike info crit = -17.9061352
Bayesian info crit = -16.9983799
[[Variables]]
a: 0.69752193 +/- 0.34404583 (49.32%) (init = 0.5)
b: 1.17700278 +/- 0.59765274 (50.78%) (init = 1.1)
c: 0.85298657 +/- 0.23838141 (27.95%) (init = 0.5)
[[Correlations]] (unreported correlations are < 0.100)
C(b, c) = -0.961
C(a, b) = -0.782
C(a, c) = 0.607