scipy.optimize.curve_fit多变量回归输入错误排查求助
解决
curve_fit报错:Improper Input: N=7 must not exceed M=3 先拆解这个错误的核心:你遇到的N是待拟合的参数数量,M是curve_fit识别到的有效数据点数量。之所以出现N=7、M=3,完全是因为模型函数定义和curve_fit的调用方式不匹配,加上一个小语法错误导致的,和你确认的变量数组长度无关。
问题1:模型函数参数结构不符合curve_fit规则
curve_fit对模型函数有明确要求:
- 第一个参数是所有自变量的集合(可以是多维数组)
- 后续参数是需要拟合的未知参数
但你的func定义是:
def func(x1,x2,x3,a,b1,b2,b3,c): return(a*np.exp(b1*x1) + b2*x2 + b3*x3 + c # 这里缺少闭合括号!
当你传入X = scipy.array([VAR1, VAR2, VAR3])(形状为(3, 162))时,curve_fit只会把这个数组作为第一个参数传给x1,剩下的x2,x3,a,b1,b2,b3,c会被自动当成待拟合参数——一共7个!同时curve_fit错误地把X的第一维度长度(3)当成了数据点数量M=3,于是就出现了7>3的报错。
问题2:函数定义的语法错误
你的return语句末尾缺少一个闭合括号,这会直接导致运行时语法错误,需要先修正。
正确修改方案
步骤1:修正模型函数参数结构
把三个自变量打包成一个参数传入,在函数内部拆分,明确待拟合参数为a,b1,b2,b3,c(共5个,和你预期一致):
def func(x, a, b1, b2, b3, c): x1, x2, x3 = x # 从自变量集合中拆分出三个变量 return a * np.exp(b1 * x1) + b2 * x2 + b3 * x3 + c # 补上闭合括号
步骤2:调整curve_fit调用方式
确保传入的自变量数组格式正确,同时保证Y是一维数组:
def formula_tester(BIO, VAR1, VAR2, VAR3): # 把三个自变量堆叠成(3, 162)的数组 X = np.array([VAR1, VAR2, VAR3]) Y = np.array(BIO) # 调用curve_fit,此时待拟合参数为a,b1,b2,b3,c共5个 popt, pcov = curve_fit(func, X, Y) return popt
步骤3:修正变量处理细节
注意Python中没有内置的ln函数,需要用np.log(numpy的自然对数函数):
Y = df['Biomass'] variable1 = df['F_cv'] variable2 = np.log(df['F_d50']) # 替换ln为np.log variable3 = np.log(df['L_d50']) parameters = formula_tester(Y, variable1, variable2, variable3) print(parameters)
额外可选写法
如果你更习惯让模型函数直接接收三个单独的自变量,可以用curve_fit的args参数传递固定自变量,但这种方式容易混淆参数顺序,仅作参考:
def func(x1, x2, x3, a, b1, b2, b3, c): return a * np.exp(b1 * x1) + b2 * x2 + b3 * x3 + c # 调用时把x2、x3作为固定参数传入,curve_fit仅拟合a,b1,b2,b3,c popt, pcov = curve_fit(func, variable1, Y, args=(variable2, variable3))
内容的提问来源于stack exchange,提问作者J Kelly
相关产品推荐
相关产品推荐

