【发布时间】:2019-02-05 21:12:48
【问题描述】:
我正在尝试用多个变量拟合一个函数,我的 fit_function 返回两个值,我需要找到适合这两个值的最佳参数。
这里是示例代码
import numpy as np
from scipy.optimize import curve_fit
# Fit function returns two values
def func(X, a, b, c):
x,y = X
val1 = np.log(a) + b*np.log(x) + c*np.log(y)
val2 = np.log(a)-4*val1/3
return (val1,val2)
# some artificially noisy data to fit
x = np.linspace(0.1,1.1,101)
y = np.linspace(1.,2., 101)
a, b, c = 10., 4., 6.
z ,v = func((x,y), a, b, c) * 1 + np.random.random(101) / 100
# initial guesses for a,b,c:
p0 = 8., 2., 7.
curve_fit(func, (x,y), (z,v), p0)
它适用于一个返回值的 fitfunction,但它不适用于两个。它给出:N=3 不得超过 M=2 错误。
if n > m:
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
Improper input: N=3 must not exceed M=2
我需要找到同时最小化val1 - z 和val2- v 之间残差的参数。
我在这里缺少什么?
这就是我的输入数据的样子。
我需要同时适合 z/x 和 v/x 的参数。
【问题讨论】:
-
根据定义,给定一个
x值,函数应该返回一个y值。您似乎返回了两个y值,我不确定您在解决什么问题。如果你要手动将方程写成 fit 函数,它会是什么样子? -
我添加图片
-
我不认为您可以获得相同的 参数 来拟合两条曲线,因为它们不是相同的曲线。左边看起来是单调增加的,而右边的趋势看起来是平的。据我所知,一次只能装一条线。现在,如果您想要一个适合两者的 模型(log vs. sin vs. linear),那么请考虑 scikit learn。
标签: python scipy curve-fitting model-fitting