如何移除拟合二阶多项式曲面上方的3D坐标点?
移除拟合二阶多项式曲面上的点的实现方法
要移除所有位于拟合曲面上方的点,只需完成两步核心操作:计算每个原始点对应的曲面预测高度,再筛选出高度小于等于预测值的点。以下是基于你提供的代码修改后的完整实现:
核心逻辑
- 用训练好的模型,计算每个原始(x,y)点在拟合曲面上的预测z值
z_pred - 对比原始z值与
z_pred,保留z <= z_pred的点(移除z大于预测值的点,即曲面上方的点)
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression np.random.seed(10) x = np.random.rand(10) y = np.random.rand(10) z = np.random.rand(10) X = np.column_stack((x, y)) # 拟合二阶多项式曲面 poly = PolynomialFeatures(degree=2) X_poly = poly.fit_transform(X) model = LinearRegression() model.fit(X_poly, z) # 计算每个原始点对应的曲面预测z值 z_pred = model.predict(poly.transform(X)) # 生成筛选掩码:保留z <= 预测值的点(移除曲面上方的点) mask = z <= z_pred # 应用掩码筛选点 x_filtered = x[mask] y_filtered = y[mask] z_filtered = z[mask] # 生成曲面网格用于可视化 xi, yi = np.meshgrid(np.linspace(np.min(x), np.max(x), 10), np.linspace(np.min(y), np.max(y), 10)) X_grid = np.column_stack((xi.flatten(), yi.flatten())) X_grid_poly = poly.transform(X_grid) z_grid = model.predict(X_grid_poly) zi = np.reshape(z_grid, xi.shape) # 可视化筛选后的点和拟合曲面 fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(projection='3d') ax.scatter(x_filtered, y_filtered, z_filtered, c='r', s=20, label='保留的点') ax.scatter(x[~mask], y[~mask], z[~mask], c='gray', s=20, alpha=0.5, label='移除的点') ax.plot_surface(xi, yi, zi, alpha=0.5) ax.legend() plt.show()
代码细节说明
z_pred = model.predict(poly.transform(X)):对原始(x,y)点做多项式特征转换后,用训练好的模型预测每个点在曲面上的高度mask = z <= z_pred:创建布尔掩码,标记需要保留的点- 可视化时额外添加了被移除点的灰色半透明显示,方便直观对比筛选效果
内容的提问来源于stack exchange,提问作者greensquare68
相关产品推荐
相关产品推荐

