python - 值错误 : Unable to determine number of fit parameters. "Problem in curve fitting"

标签 python numpy

我是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 Traceback(最近一次调用最后一次) 在 13 #y = 数据[:, 1] 14 plt.plot(data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], 'b-', label='data') ---> 15 popt, pcov = curve_fit(func, data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5]) 16 弹出 17

    ~/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.

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

最佳答案

我认为问题是 curve_fit 函数无法通过内省(introspection)确定参数的数量,因为您要求它拟合的函数(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

如果出于性能原因需要向量化,您还可以传递参数p0初始参数数组。例如:

popt, pcov = curve_fit(func, x_data, y_data, p0=[1,1,1])

关于python - 值错误 : Unable to determine number of fit parameters. "Problem in curve fitting",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796489/

相关文章:

python - 如何在 Windows 10 上安装和使用 Pynini?

python - 如何使用 models.py 、 serializers.py 和 views.py 将解析的 json 数组值保存到 django python Rest api 中的数据库

python - 使用 OpenCV 校正蒙版中形状的边缘

python - 插入 python 数组以最小化元素之间的最大差异

python - 在 Numpy 数组中查找子列表的索引

python - 将 numpy 数组转换为 cython 指针

python - 使用字典使用 matplotlib 绘制条形图

python - 为什么有时 python 解释器无法识别向上箭头键?

python - 测试类中所有测试用例的模拟导入方法

numpy - 查询SVM参数设置