TypeError: fun() takes 1 positional argument but 2 were given error in sciply.optimize.curve_fit

TypeError: fun() takes 1 positional argument but 2 were given error in sciply.optimize.curve_fit

我正在尝试使用 scipy.optimize.curve_fit,但似乎遇到了一些问题。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import os
os.chdir('C:/Users/Sams PC/Desktop/')
data1=np.loadtxt('Titrations6.txt')
data2=np.loadtxt('Concentrations3.txt')
protein=data2[:,0]
ligand=data2[:,1]
b=data1.transpose()
for x in b:
    def fun(kd):
        return np.array((B+kd-(np.sqrt(((B+kd)**2)-4*A*C)))/2*A)

    from scipy.optimize import curve_fit
    intensity=[x]
    xdata=[protein,ligand]
    ydata=intensity
    A=xdata[0]
    B=xdata[0]+xdata[1]
    C=xdata[1]
    print (xdata)
    print (ydata)
    popt, pcov=curve_fit(fun,xdata,ydata, p0=(1))

data1是一个8x6的矩阵,data2是一个2x6的矩阵。我希望我的函数遍历并适合 data1 的每一列。当我 运行 出现以下错误时:

TypeError: fun() takes 1 positional argument but 2 were given

我不太明白。我只给出了 fun 一个参数,但它说它实际上已经给出了 2 个参数。任何帮助将不胜感激!

编辑: 为了清楚起见,我在下面添加了我正在使用的数据。这就是我打印 (data1) 和 data2 时得到的结果。

[[0.         0.         0.         0.         0.         0.
  0.         0.        ]
 [0.         0.         0.         0.         0.         0.
  0.         0.        ]
 [0.41437697 0.23486582 0.3946243  0.37853352 0.35563582 0.39256528
  0.32845158 0.37614817]
 [0.56069666 0.47530052 0.59725788 0.65505611 0.53696339 0.56234781
  0.59790931 0.61088421]
 [0.80054062 0.6781974  0.79853213 0.88599716 0.80807803 0.84945185
  0.82345173 0.8316841 ]
 [1.         1.         1.         1.         1.         1.
  1.         1.        ]]
[[0.59642147 0.06      ]
 [0.5859375  0.11928429]
 [0.56603774 0.29296875]
 [0.53003534 0.62264151]
 [0.41899441 1.21908127]
 [0.38861986 3.05865922]]

主要问题是您没有指定任何要优化的参数。参见 scipy.optimize.curve_fit。此外,我建议在循环外导入和定义函数。 一个模型函数的基本形式是:

def fun(independent_variable, *parameters_to_optimize):
    # return a combination of the independent variable and parameters

一个例子:

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

# Generate some noisy data
x = np.linspace(0, 10, 1000)
y = x**2 + 3*x + np.random.normal(0, 0.5, len(x))

# define the model I want to fit
def fun(x, a, b, c):
    return a + b * x + c * x ** 2

popt, pcov = curve_fit(fun, x, y)

# plot
plt.plot(x, y, label='data')
plt.plot(x, fun(x, *popt), label='fitted')
plt.grid()
plt.legend()
print(popt)
# [-0.07309343  3.01359277  0.99988617]

在你的例子中有两个错误:

def fun(kd):
    return np.array((B+kd-(np.sqrt(((B+kd)**2)-4*A*C)))/2*A) 
  • 对于curve_fit这个函数没有什么可以优化的,它只有一个变量,假设是独立的。
  • curve_fit 期望模型函数输出数字,而不是数组

没有看到实际数据,我只能这么说。