我是新來的分析,我正在尋找一個解決方案找到一個模型來解決非線性方程的形式Y=a(X1^b) + c(X2^d) + e
(其中X1,X2是自變量) 下面是一個完整的集合,不幸的是我們沒有太多的觀察,我們需要的只是任何簡單的擬合。但是這些數據沒有任何異常值,每個觀測值都必須考慮。尋找非線性方程python scipy
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: Improper input: N=5 must not exceed 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: Optimal parameters not found: Number of calls to function has reached maxfev = 1200.
然後我不得不刪除變量d並保留函數爲
def func(X, a, b, c ,e):
x1,x2 = X
return a*x1**b + c*x2 + e
最後它沒有運行,但再次與下面的警告,但效果並不好
RuntimeWarning: overflow encountered in power
注意
x3 = max(x2 - {(x1^2)*2.6},0)
和解決
y=a*(x3^b) gives a=0.89 and b=0.58 with r2=0.98 and error=0.19 which is the best one i could get so far
但我會喜歡以廣義形式得到結果w沒有我試圖等同於一個關係。由於基於數據集,函數x3 = f(x1,x2)可以改變,對於所有情況它不是一個固定的方程。