You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从零实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:32:14