首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何装饰用于curve_fit的函数?

如何装饰用于curve_fit的函数?
EN

Stack Overflow用户
提问于 2022-08-20 14:38:29
回答 1查看 33关注 0票数 0

我正在创建一个n大小的多项式,我想对我的数据进行拟合。因为有了装饰器,它应该在每次运行函数时打印"test“,但是,由于装饰器,curve_fit不再知道它应该提供多少参数(我得到了错误:ValueError: Unable to determine number of fit parameters.)。有没有办法让curve_fit“知道”它应该提供多少参数?

代码语言:javascript
运行
复制
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()
EN

Stack Overflow用户

回答已采纳

发布于 2022-08-20 16:17:11

您的函数使用*args和**kwargs动态捕获参数,但是curve_fit需要知道您的函数使用了多少参数。您可以在您的情况下传递p0=[1]*(n+1)来解决错误。您可以查看curve_fit实现/文档以获得更多细节。

您还需要修复行:func_str += ": var_0" (按照lambda函数的预期,在var0上添加下划线)。

此外,在实现上,您可以使用一个循环而不是动态创建lambda函数,这样可以更容易调试,也可能更容易读取。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73427563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档