如何解决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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。