繁体   English   中英

Python - 将表面拟合到离散数据点

[英]Python - Fitting surface to discrete data points

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

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

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 个值)的二维数组

对于 n=3,我的数据如下所示:

import numpy as np

x1 = np.array([1., 2., 3.])
x2 = np.array([10.0, 11.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, 2.0, 4.0], [11.0, 20.0, 11.0], [0.5, 0.4, 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 learn 中的回归函数,但我无法理解如何将这些函数与我以前的形式的数据一起使用。

任何帮助是极大的赞赏! 谢谢!

如果您要寻找的是“询问”域内的函数(即插值),我建议您查看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, 20), 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()

多线性插值的图示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM