我是分析新手,我正在寻找一种解决方案,找到一个模型来解决Y=a(X1^b) + c(X2^d) + e
形式的非线性方程(其中X1,X2是自变量)
下面是一整套,不幸的是我们没有太多的观察,我们需要的只是任何简单的拟合。但是这些数据没有任何异常值,每个观察都必须考虑。
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
import sympy as sym
x1=np.array([217,160,97,75])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344])
y=np.array([14,7,7,1])
def func(X, a, b, c ,d , e ):
x1,x2 = X
return a*x1**b + c*x2**d + e
popt, pcov = curve_fit(func, (x1,x2), y)
plt.plot(y, func((x1,x2), *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
但是运行curve_fit会让我错误地说
TypeError:输入不正确:N = 5不得超过M = 4
然后我不得不添加几个虚拟输入作为几乎相似值的观察值,添加小数点差异导致错误
x1=np.array([217,160,97,75,76,219])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344,1.420635344,143.420635344])
y=np.array([14,7,7,1,1,14])
RuntimeError:找不到最佳参数:调用次数 功能已达到maxfev = 1200。
然后我必须删除变量d并将函数保持为
def func(X, a, b, c ,e ):
x1,x2 = X
return a*x1**b + c*x2 + e
最后它确实运行但是再次发出警告,但结果并不好
运行时警告:电源遇到溢出
请注意
x3 = max(x2 - {(x1 ^ 2)* 2.6},0)
并解决
y = a *(x3 ^ b)给出a = 0.89和b = 0.58,r2 = 0.98,误差= 0.19,这是迄今为止我能得到的最好的
但我希望将结果以一般化的形式存在,而不是试图将关系等同起来。因为基于数据集,函数x3 = f(x1,x2)可以改变,并且它不是所有情况的固定方程。
答案 0 :(得分:0)
获得可接受的拟合结果的一个非常好的方法是使用自由参数的初始猜测。 curve_fit
采用p0
参数。如果两个数据集之间的数据变化不大,这应该是正确的方法。根据我的经验,考虑好的起始值p0
并通过参数bounds
设置限制是一种很好的方法。否则,如果您不必了解数学关系,则可以尝试插入数据。