python 中的多元曲线拟合

Multivariate curve fit in python

有人能给我指出正确的方向吗...

我需要找到两个函数的参数a,b,c,d:

Y1 = ( (a * X1 + b) * p0 + (c * X2 + d) * p1 ) / (a * X1 + b + c * X2 + d)

Y2 = ( (a * X2 + b) * p2 + (c * X2 + d) * p3 ) / (a * X1 + b + c * X2 + d)

X1、X2(自变量)和 Y1、Y2(因变量)是观测值,即一维数组,每个数组都有数千个条目。

p0、p1、p2、p3 是已知常数(标量)。

我仅通过曲线拟合成功解决了第一个函数的问题(见下文),但我该如何解决 Y1 和 Y2 的问题?

谢谢。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit


X  = [X1,X2]

def fitFunc(X, a,b,c,d):
    X1, X2 = X
    return ((a * X1 + b) * p0  + (c * X2 + d) * p1) / (a * X1 + b + c * X2 + d)

fitPar, fitCov = curve_fit(fitFunc, X, Y1)

print(fitPar)

一种方法是使用 scipy.optimize.minimze 将两个函数一起最小化。在下面的示例中,函数 residual 被传递给 abcd 作为初始猜测。使用这些猜测,评估 Y1Y2,然后使用各自函数的数据和预测值来计算均方误差。误差作为两个函数的平均误差返回。优化后的参数集作为 res.x.

存储在 res
import numpy as np
from scipy.optimize import minimize

#p0 = ... known
#p1 = ... known
#p2 = ... known
#p3 = ... known

def Y1(X, a,b,c,d):
    X1, X2 = X
    return ((a * X1 + b) * p0  + (c * X2 + d) * p1) / (a * X1 + b + c * X2 + d)

def Y2(X, a,b,c,d):
    X1, X2 = X
    return ((a * X1 + b) * p2  + (c * X2 + d) * p3) / (a * X1 + b + c * X2 + d)

X1 = np.array([X1]) # your X1 array
X2 = np.array([X2]) # your X2 array
X = np.array([X1, X2])
y1_data = np.array([y1_data]) # your y1 data
y2_data = np.array([y2_data]) # your y2 data

def residual(x):
    a = x[0]
    b = x[1]
    c = x[2]
    d = x[3]
    y1_pred = Y1(X,a,b,c,d)
    y2_pred = Y2(X,a,b,c,d)
    err1 = np.mean((y1_data - y1_pred)**2)
    err2 = np.mean((y2_data - y2_pred)**2)
    error = (err1 + err2) / 2
    return error

x0 = [1, 1, 1, 1] # Initial guess for a, b, c, and d respectively
res = minimize(residual, x0, method="Nelder-Mead")  
print(res.x)