numpy 删除曲面上方的点

stszievb  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(146)

给定一组3D坐标及其对应的二阶多项式曲面,我想移除曲面上方的所有点。下面的代码片段显示了3D空间中拟合曲面和点的示例。

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)

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,y,z, c='r', s=20)
ax.plot_surface(xi,yi,zi)
plt.show()

如何移除拟合曲面上方的所有点?

2w3rbyxf

2w3rbyxf1#

应将原始点的z坐标与模型在x,y坐标处预测的相应z坐标进行比较。如果原始z坐标大于预测的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)

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)

z_pred = model.predict(poly.transform(X))
mask = z <= z_pred
x_filtered, y_filtered, z_filtered = x[mask], y[mask], z[mask]

fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(projection='3d')
ax.scatter(x_filtered, y_filtered, z_filtered, c='r', s=20)
ax.plot_surface(xi,yi,zi)
plt.show()

相关问题