从零实现ANN:3D曲线数据点切线绘制与决策边界可视化
实现步骤与技术指导
1. 依赖库安装
先安装所需工具库,用于数值计算、3D可视化和微分计算:
pip install numpy matplotlib scipy
2. 核心逻辑
- 切线计算:对3D曲线上的点,用数值微分(中心差分法)计算梯度作为切线方向向量,归一化后生成可视化用的切线线段。
- 决策边界可视化:ANN的决策边界通常是输出等于阈值(如二分类任务的0.5)的曲面,先通过插值将离散输出点拟合为连续曲面,再提取等值面作为决策边界,最后计算边界上点的切线。
3. 代码示例
3.1 准备3D曲线数据(替换为你的ANN输出)
先模拟一组类似ANN输出的参数化3D曲线,若已有真实数据,直接替换这部分即可:
import numpy as np # 生成参数化3D曲线(模拟ANN的输出结果) t = np.linspace(0, 4*np.pi, 200) x = t * np.cos(t) y = t * np.sin(t) z = np.tanh(t/2) # 模拟ANN激活函数的输出特性 curve_points = np.column_stack((x, y, z))
3.2 计算曲线上点的切线方向
用高斯平滑减少噪声干扰,再通过中心差分求导得到切线方向向量:
from scipy.ndimage import gaussian_filter1d def compute_tangents(points, sigma=1): # 高斯平滑曲线,降低噪声对导数计算的影响 x_smooth = gaussian_filter1d(points[:,0], sigma) y_smooth = gaussian_filter1d(points[:,1], sigma) z_smooth = gaussian_filter1d(points[:,2], sigma) # 中心差分法计算切线方向向量 dx = np.gradient(x_smooth) dy = np.gradient(y_smooth) dz = np.gradient(z_smooth) # 归一化方向向量,保证切线长度一致 norm = np.sqrt(dx**2 + dy**2 + dz**2) dx /= norm dy /= norm dz /= norm return dx, dy, dz # 计算所有点的切线方向 dx, dy, dz = compute_tangents(curve_points) # 选取曲线上5个样本点用于切线可视化 sample_indices = [20, 60, 100, 140, 180] sample_points = curve_points[sample_indices] sample_tangents = np.column_stack((dx[sample_indices], dy[sample_indices], dz[sample_indices]))
3.3 3D可视化:曲线+切线+决策边界
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制原始ANN输出曲线 ax.plot(curve_points[:,0], curve_points[:,1], curve_points[:,2], label='ANN Output Curve', color='blue', alpha=0.6) # 绘制切线:从样本点向正负方向延伸固定长度 tangent_length = 3 for point, tangent in zip(sample_points, sample_tangents): # 正向切线 ax.plot([point[0], point[0] + tangent_length*tangent[0]], [point[1], point[1] + tangent_length*tangent[1]], [point[2], point[2] + tangent_length*tangent[2]], color='red', linewidth=2) # 反向切线 ax.plot([point[0], point[0] - tangent_length*tangent[0]], [point[1], point[1] - tangent_length*tangent[1]], [point[2], point[2] - tangent_length*tangent[2]], color='red', linewidth=2) # 标记样本点 ax.scatter(point[0], point[1], point[2], color='green', s=50, zorder=10) # 绘制决策边界(以z=0.5为例,对应二分类任务的决策阈值) xx, yy = np.meshgrid(np.linspace(-15, 15, 50), np.linspace(-15, 15, 50)) # 插值拟合连续曲面 zz = griddata(curve_points[:,0:2], curve_points[:,2], (xx, yy), method='cubic') # 提取z=0.5的等值面作为决策边界 ax.contourf(xx, yy, zz, levels=[0.49, 0.51], colors='gray', alpha=0.3) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('ANN Output (Z)') ax.legend() plt.title('3D ANN Output Curve with Tangents and Decision Boundary') plt.show()
4. 关键注意事项
- 噪声处理:如果ANN输出数据存在噪声,调大
compute_tangents函数中的sigma参数,增强高斯平滑效果,避免切线方向波动过大。 - 决策边界适配:如果是多分类任务,需针对每个类别输出阈值提取对应等值面;若为回归任务,可根据业务需求设定边界阈值。
- 切线长度控制:根据曲线的整体尺度调整
tangent_length,保证切线在可视化中清晰可见且不遮挡曲线本身。
内容的提问来源于stack exchange,提问作者Fatihi Youssef
相关产品推荐
相关产品推荐

