我有4个点,用这些坐标表示:
X = [0.1, 0.5, 0.9, 0.18]
Y = [0.7, 0.5, 0.7, 0.3]
Z = [4.2, 3.3, 4.2, 2.5]我必须得到近似这4个点的最佳线性函数(平面)。
我知道numpy.polyfit,但polyfit只适用于x和y (2D),我能做什么?
发布于 2017-03-17 04:28:31
虽然不是完全通用的,但如果数据点可以合理地表示为相对于坐标平面的曲面,例如z= a_x + b_y +c,则可以使用np.linalg.lstsq
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
X = np.array([0.1, 0.5, 0.9, 0.18])
Y = np.array([0.7, 0.5, 0.7, 0.3])
Z = np.array([4.2, 3.3, 4.2, 2.5])
# least squares fit
A = np.vstack([X, Y, np.ones(len(X))]).T
a,b,c= np.linalg.lstsq(A, Z)[0]
# plots
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# plot data as big red crosses
ax.scatter(X, Y, Z, color='r', marker='+', linewidth=10)
# plot plane fit as grid of green dots
xs = np.linspace(min(X), max(X), 10)
ys = np.linspace(min(Y), max(Y), 10)
xv, yv = np.meshgrid(xs, ys)
zv = a*xv + b*yv + c
ax.scatter(xv, yv, zv, color = 'g')
# ax.plot_wireframe(xv, yv, zv, color = 'g') # alternative fit plane plot
plt.show()首先绘制数据,您可以为“自变量”平面选择不同的坐标对以避免病态结果。如果数据点看起来位于包含z轴的平面中,则使用xz或yz
当然,你可以在一条直线上有退化的点,或者是正四面体的顶点。
为了获得更好的“几何拟合”,可以使用第一个拟合的平面作为旋转到该坐标系中的数据的第二最小二乘拟合的基础(如果数据“合理地”类似于平面)。

https://stackoverflow.com/questions/42841632
复制相似问题