如何在Python中将平面适配到3D数据集
我有一组x,y和z点,我试图将一个平面拟合到这个三维数据中,这样就可以计算出任意x和y的z=f(x,y) 我希望得到一个平面方程,并在Jupyter笔记本中绘制图形,以便可视化 这是我用来绘制数据的(工作)代码如何在Python中将平面适配到3D数据集,python,numpy,matplotlib,jupyter-notebook,Python,Numpy,Matplotlib,Jupyter Notebook,我有一组x,y和z点,我试图将一个平面拟合到这个三维数据中,这样就可以计算出任意x和y的z=f(x,y) 我希望得到一个平面方程,并在Jupyter笔记本中绘制图形,以便可视化 这是我用来绘制数据的(工作)代码 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import pandas as pd x = np.arange(-12, 1) y = np.ara
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pandas as pd
x = np.arange(-12, 1)
y = np.arange(-40,-25)
Z = array([[402., 398., 395., 391., 387., 383., 379., 375., 371., 367., 363.,358., 354.],
[421., 417., 413., 409., 406., 402., 398., 393., 389., 385., 381.,
376., 372.],
[440., 436., 432., 429., 425., 421., 416., 412., 408., 404., 399.,
395., 391.],
[460., 456., 452., 448., 444., 440., 436., 432., 427., 423., 419.,
414., 410.],
[480., 477., 473., 469., 465., 460., 456., 452., 447., 443., 438.,
434., 429.],
[501., 498., 494., 490., 485., 481., 477., 472., 468., 463., 459.,
454., 449.],
[523., 519., 515., 511., 507., 502., 498., 494., 489., 484., 480.,
475., 470.],
[545., 541., 537., 533., 529., 524., 520., 515., 511., 506., 501.,
496., 492.],
[568., 564., 560., 556., 551., 547., 542., 538., 533., 528., 523.,
518., 513.],
[592., 588., 583., 579., 575., 570., 565., 561., 556., 551., 546.,
541., 536.],
[616., 612., 607., 603., 598., 594., 589., 584., 579., 575., 569.,
564., 559.],
[640., 636., 632., 627., 623., 618., 613., 609., 604., 599., 593.,
588., 583.],
[666., 662., 657., 653., 648., 643., 638., 633., 628., 623., 618.,
613., 607.],
[692., 688., 683., 679., 674., 669., 664., 659., 654., 649., 643.,
638., 632.],
[ nan, 714., 710., 705., 700., 695., 690., 685., 680., 675., 669.,
664., 658.]])
X, Y = np.meshgrid(x, y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
print (X.shape, Y.shape, Z.shape)
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
我已尝试实施这些解决方案:
但是,由于我的x和y数组的长度不同,因此我收到以下错误消息:
ValueError: all the input array dimensions except for the concatenation axis must match exactly
欢迎任何帮助。谢谢 在绘图过程中,您共享的数据似乎对我有用。您的
X、Y、Z
都具有相同的大小。在Z
数组中有一个nan
值。可以在估计平面方程时删除该点
您希望将数据拟合到三维平面中。因此,这是一个线性回归问题。您可以使用scikit学习包中的多元回归来估计平面方程的系数
平面方程如下所示:
Z=a1*X+a2*Y+c
您可以按如下方式展平数据,并使用scikit-learn
的linear\u模型
将平面拟合到数据。请参阅下文:
# your data is stored as X, Y, Z
print(X.shape, Y.shape, Z.shape)
x1, y1, z1 = X.flatten(), Y.flatten(), Z.flatten()
X_data = np.array([x1, y1]).reshape((-1, 2))
Y_data = z1
from sklearn import linear_model
reg = linear_model.LinearRegression().fit(X_data, Y_data)
print("coefficients of equation of plane, (a1, a2): ", reg.coef_)
print("value of intercept, c:", reg.intercept_)
上述代码将使平面与给定的线性数据相匹配
要适合二度曲面,请进一步阅读
您将获得以下形式的二次曲面方程:
Z=a1*X+a2*Y+a3*X*Y+a4*X*X+a5*Y*Y+c
要使用线性回归拟合此曲线,必须按以下方式修改上述代码:
# your data is stored as X, Y, Z
print(X.shape, Y.shape, Z.shape)
x1, y1, z1 = X.flatten(), Y.flatten(), Z.flatten()
x1y1, x1x1, y1y1 = x1*y1, x1*x1, y1*y1
X_data = np.array([x1, y1, x1y1, x1x1, y1y1]).T # X_data shape: n, 5
Y_data = z1
from sklearn import linear_model
reg = linear_model.LinearRegression().fit(X_data, Y_data)
print("coefficients of equation of plane, (a1, a2, a3, a4, a5): ", reg.coef_)
print("value of intercept, c:", reg.intercept_)
非常感谢你的帮助,阿迪蒂亚。您的解决方案可行,但Z上有一个很大的错误(至少50%)。我如何更改代码以拟合多项式曲面而不是平面?@rad189我已更新代码以包括二阶曲线拟合。我希望它能解决你的问题。非常感谢你,再见!伟大的解决方案