python三维插值从规则⽹格到散点_python中三维样条插值3+维的样条插值可以使⽤scipy.interpolate.Rbf完成,如您所述。为了绘图,您可以使⽤较⼩的分辨率(1000点是⼀个很好的经验法则),当您想要计算样条曲线时,您可以在⼤于132000点的点上进⾏插值,⽽不会出现问题(请参见下⾯的⽰例)。
你能在matlab中添加⼀个Minimal, Complete, and Verifiable example来做你想做的事情吗?这将解释为什么需要创建分辨率为132000点的栅格空间。另外,请注意,有⼀个维度诅咒。Matlab使⽤的cubic spline or a piecewise polynomial可能由于过度拟合⽽变得危险。我建议您使⽤⼀种更理智的⽅法来培训51个数据点,并应⽤到132000多个数据点。This是多项式曲线拟合和模型选择的⼀个很好的例⼦。
⽰例:
⽣成数据:import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
random pythonfrom mpl_toolkits.mplot3d import axes3d
%matplotlib inline
import random
# set seed to reproducible
random.seed(1)
data_size = 51
max_value_range = 132651
x = np.array([random.random()*max_value_range for p in range(0,data_size)])
y = np.array([random.random()*max_value_range for p in range(0,data_size)])
z = 2*x*x*x + np.sqrt(y)*y + random.random()
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.scatter3D(x,y,z, c='r')
拟合样条曲线并插值x_grid = np.linspace(0, 132651, 1000*len(x))
y_grid = np.linspace(0, 132651, 1000*len(y))
B1, B2 = np.meshgrid(x_grid, y_grid, indexing='xy')
Z = np.zeros((x.size, z.size))
import scipy as sp
import scipy.interpolate
spline = sp.interpolate.Rbf(x,y,z,function='thin_plate',smooth=5, episilon=5)
Z = spline(B1,B2)
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.plot_wireframe(B1, B2, Z)
ax.plot_surface(B1, B2, Z,alpha=0.2)
ax.scatter3D(x,y,z, c='r')
在⼤数据上拟合样条曲线predict_data_size = 132000
x_predict = np.array([random.random()*max_value_range for p in range(0,predict_data_size)]) y_predict = np.array([random.random()*max_value_range for p in range(0,predict_data_size)]) z_predict = spline(x_predict, y_predict)
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.plot_wireframe(B1, B2, Z)
ax.plot_surface(B1, B2, Z,alpha=0.2)
ax.scatter3D(x_predict,y_predict,z_predict, c='r')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论