gpt4 book ai didi

python - 将列表列表作为输入传递给 scipy.optimize.curve_fit

转载 作者:行者123 更新时间:2023-12-01 09:11:37 26 4
gpt4 key购买 nike

我正在尝试使用 python 和 curve_fit 函数解决示例营销组合模型问题。

我需要适应两组参数,我将它们作为 * arg 列表列表添加到我的函数中。我可以让曲线拟合适用于一组参数(单个列表),但不能适用于两个参数。

代码

#import packages
from scipy.optimize import curve_fit
import pandas as pd
import numpy as np
from statsmodels.tsa.filters.filtertools import recursive_filter as rec

数据集

a = np.array(0).repeat(150)
b = np.array(0).repeat(150)
c = np.array(0).repeat(150)
a[0:90] = np.random.uniform(5,10,(90,))
b[50:150] = np.random.uniform(20,40,(100,))
c[30:100] = np.random.uniform(5,25,(70,))
df = pd.DataFrame({'a':a,'b':b,'c':c})

拟合一组参数

def mmm(data,*param):
dic = {}
j = 0
for i in data:
dic[i] = rec(data[i],param[j])
j += 1
return(np.sum(pd.DataFrame(dic),1))

该函数使用不同的 lambda 参数将递归过滤器应用于数据参数中的每个字段,并返回数据帧行总和。

kpi = mmm(df,*(0.5,0.5,0.1)) + np.random.uniform(-5,5)

将*参数传递给 scipy 曲线拟合函数时,您必须定义一个输出函数的函数。如此处所述:Pass tuple as input argument for scipy.optimize.curve_fit

拟合曲线

a = np.zeros(3)
def make_func():
def mmm(data,*param):
dic = {}
j = 0
for i in data:
dic[i] = rec(data[i],param[j])
j += 1
return(np.sum(pd.DataFrame(dic),1))
return(mmm)
leastsq, covar = curve_fit(make_func(),df,kpi,a)

print(leastsq)
array([0.87560795, 0.87192766, 0.84864161])

拟合两组参数

def mmm(x,*arg):
c = args[0]
a = args[1]
dic = {}
j = 0
for i in x:
dic[i] = c[j] * rec(x[i], a[j])
j += 1
return(np.sum(pd.DataFrame(dic),1))

该函数使用不同的 lambda (a) 将递归过滤器应用于数据参数中的每个字段,将其乘以标量 (c) 并获取数据帧的行总和。

args = [[4,5,3],[0.2,0.4,0.5]]
kpi = mmm(df,*args) + np.random.uniform(-5,5)

拟合曲线

args = np.zeros(6)
def make_func():
def mmm(x,*args):
c = args[0]
a = args[1]
dic = {}
j = 0
for i in x:
dic[i] = c[j] * rec( x[i], a[j])
j += 1
return(np.sum(pd.DataFrame(dic),1))
return(make_func)
leastsq, covar = curve_fit(make_func,df, kpi, p0=args)

使用与一个参数列表相同的方法会对两个参数产生错误。错误如下:

TypeError: make_func() takes 0 positional arguments but 7 were given

为了让这段代码正常工作,我还需要做些什么吗?

干杯,

最佳答案

在我看来,有两件事是错误的根源。

1) 在函数 make_func() 中拟合曲线的最后一部分中,您将返回函数本身。如果我将它与之前的函数定义进行比较,我认为它应该是return(mmm)

2) args = np.zeros(6) 生成一个由零组成的数组,您可以将其作为参数传递给 make_func()。然后分配 c = args[0]a = args[1] 所以基本上是 c=0a=0 是标量变量。现在,在 mmm(x,*args): 函数中,您使用 dic[i] = c[j] * rec( x[i], a[j]) 。这里弹出IndexError:标量变量的索引无效。因为ac是标量,但您正在对它们使用索引操作。

关于python - 将列表列表作为输入传递给 scipy.optimize.curve_fit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com