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 期望模型函数输出数字,而不是数组
没有看到实际数据,我只能这么说。
我正在尝试使用 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 期望模型函数输出数字,而不是数组
没有看到实际数据,我只能这么说。