我正在创建一个n大小的多项式,我想对我的数据进行拟合。因为有了装饰器,它应该在每次运行函数时打印"test“,但是,由于装饰器,curve_fit不再知道它应该提供多少参数(我得到了错误:ValueError: Unable to determine number of fit parameters.
)。有没有办法让curve_fit“知道”它应该提供多少参数?
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def print_dec(func_): # prints test before function
def inner(*args, **kwargs):
print("test")
returned_value = func_(*args, **kwargs)
return returned_value
return inner
n = 10
func_str = "lambda x" # function creation
for i in range(n+1):
func_str += f", var_{i}"
func_str += ": var0"
for i in range(1, n+1):
func_str += f" + var_{i}*x**{i}"
print(func_str)
func = eval(func_str)
func = print_dec(func)
x_data = np.linspace(0, 20, 1000)
y_data = x_data + np.random.random(1000) # data is just a straight line with noise
p_opt, p_cov = curve_fit(func, xdata=x_data, ydata=y_data)
print(p_opt) # simple curve_fit
plt.plot(x_data, func(x_data, *p_opt), c='r') # fitted curve
plt.scatter(x_data, y_data) # original data
plt.show()
发布于 2022-08-20 16:17:11
您的函数使用*args和**kwargs动态捕获参数,但是curve_fit需要知道您的函数使用了多少参数。您可以在您的情况下传递p0=[1]*(n+1)
来解决错误。您可以查看curve_fit实现/文档以获得更多细节。
您还需要修复行:func_str += ": var_0"
(按照lambda函数的预期,在var0上添加下划线)。
此外,在实现上,您可以使用一个循环而不是动态创建lambda函数,这样可以更容易调试,也可能更容易读取。
https://stackoverflow.com/questions/73427563
复制相似问题