Python ValueError:无法确定拟合参数的数量&引用;“曲线拟合中的问题”;

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],

我是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波普 十七,

    ~/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
vs
math
有关。为了完整性,并且由于您提到了
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