Python-使表面适合离散数据点

问题描述

我需要计算对具有一个因变量的n维数据(n =自变量的数量)的最佳(或最佳)拟合。没有分析功能,只有一组数据点。

对于一个n = 2的示例,其中每个自变量具有3个值,我有代码

import numpy as np

x1 = np.array([1.,2.,3.]) 
x2 = np.array([10.0,11.0,12.0] )
xdata = []
xdata.append(x1)
xdata.append(x2)

z = np.array([[4.0,2.0,4.0],[11.0,20.0,11.0],[0.5,0.4,0.5]])

z是具有9个值(3 x 3个值)的2D数组

对于n = 3,我有如下数据:

import numpy as np

x1 = np.array([1.,3.])
x2 = np.array([10.0,12.0])
x3 = np.array([0.1,0.2,0.3])
xdata = []
xdata.append(x1)
xdata.append(x2)
xdata.append(x3)

z = np.array([[[4.0,0.5]],[[8.3,8.1,9.0],[4.2,0.1,0.2],[10.1,4.5,1.2]],[[7.2,7.21,7.22],[0.8,1.2,0.9],[ 4.1,0.3,3.1]]] )

z是一个具有27个值(3 x 3 x 3个值)的3维数组。

我想编写Python代码以找到曲面,可以使用某种阶次多项式或多维回归来尽可能地接近数据。

然后,我希望能够“询问”该函数获取独立变量的任意值,但要在上限和下限之内。

我已经尝试过scipy.optimize.curve_fit和scikit中的回归函数来学习,但是我很难理解如何将这些函数与以前形式的数据一起使用。

任何帮助将不胜感激!谢谢!

解决方法

如果您要查找的是“查询”域内部的功能(即插值),则建议您查看scipy.interpolate

多线性插值看起来像这样:

import numpy as np
from scipy.interpolate import RegularGridInterpolator

z = np.array([[4.0,2.0,4.0 ],[11.0,20.0,11.0],[0.5,0.4,0.5 ],[1.0,-5.0,0.5 ]])

x1 = np.array([1.,2.,3.,4]) 
x2 = np.array([10.0,11.0,12.0])

f = RegularGridInterpolator((x1,x2),z,bounds_error=False,fill_value=None)
def convenient_f(x1,x2):
    x = np.vstack((x1.ravel(),x2.ravel())).T
    z = f(x)
    return z.reshape(x1.shape)

您可以致电convenient_f(x1,x2),告知您的新积分。例如,您可以轻松地绘制它:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt

X1,X2 = np.meshgrid(x1,x2,indexing='ij')
x1_surface,x2_surface = np.meshgrid(np.linspace(1,4,20),np.linspace(10,12,indexing='ij')

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot(X1.ravel(),X2.ravel(),z.ravel(),"ok")
ax.plot_surface(x1_surface,x2_surface,convenient_f(x1_surface,x2_surface),alpha=0.5)
plt.show()

Illustration of the multilinear interpolation