【发布时间】:2018-08-01 01:53:51
【问题描述】:
我正在尝试使用 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
为了让这段代码正常工作,我还需要做些什么吗?
干杯,
【问题讨论】:
-
尝试在最后一行的
make_func后面加上括号()。您的错误不可重现,因为我们不知道df是什么 -
我更新了上面的内容以包含 df 数据框。
-
错字:在函数定义
def mmm(x,*arg):的标题“拟合两组参数”之后,应该是*args而不是*arg
标签: python python-3.x scipy mathematical-optimization curve-fitting