ValueError:无法确定拟合参数的数目。““曲线拟合中的问题”

2024-09-28 22:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,所以我的知识还不够。 我有一个名为“tlove_cc_seq2_k2_NL3.dat”的数据文件。我想根据数据拟合曲线。 我使用的代码如下:

。。。在

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    import math
    import pandas as pd
    import lmfit
    from lmfit import Model
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    from array import *

    def test(x, a, b, c): 
         return (a + b*math.log(x) + c*math.log(x)**2)

    func = np.vectorize(test)

    data_k2_2fl_NL3=np.loadtxt('tlove_cc_seq2_k2_NL3.dat')
    plt.plot(data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], 'b-', label='data')
    popt, pcov = curve_fit(func, data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5])
    popt

    plt.plot(data_k2_2fl_NL3[:,8], func(data_k2_2fl_NL3[:,8], *popt), 'r-',
             label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
    popt, pcov = curve_fit(func, data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], bounds=(-20, 
    [30., 30., 20.5]))
    popt

    plt.plot(data_k2_2fl_NL3[:,8], func(data_k2_2fl_NL3[:,8], *popt), 'g--',
             label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.show()

。。。在

我得到的错误如下:

。。。 ValueError回溯(最近一次调用) 在里面 13#y=数据[:,1] 14plt.绘图(data_k2_2fl_NL3[:,8],数据_k2_2fl_NL3[:,5],“b-”,label=”数据“) --->;15 popt,pcov=曲线拟合(func,data_k2_2fl_NL3[:,8],data_k2_2fl_NL3[:,5]) 16磅 17

^{pr2}$

我如何解决这个问题? 谢谢您。在


Tags: 数据fromimportdataasnppltk2
2条回答

似乎您遇到的大多数问题都与使用numpyvsmath有关。为了完整起见,并且由于您提到了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_fit()将欣然接受未初始化的参数,并为所有参数指定不可能调整的默认值1。Lmfit不允许这样做,并强制您显式地设置初始值。但它也能更好地报告统计数据、不确定性,并允许组合更多的complpex模型。在

对于您的示例,fit报告将显示

^{pr2}$

还有一个阴谋

enter image description here

我认为问题在于curve_fit函数无法通过自省来确定参数的数量,因为您要求它匹配的函数(test)被包装在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组:

^{pr2}$

相关问题 更多 >