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

如何绘制带QDA决策边界的3D散点图?解决代码维度报错问题

3D空间QDA决策边界绘制问题解决

错误原因

你的代码报错核心在于plot_surface函数要求输入的xx、yy、zz必须是2D数组,但np.meshgrid针对3个特征生成的是3D数组(形状为(N, M, K)),不符合参数要求。此外,QDA在3D特征空间中的决策边界是二次曲面,直接用全网格点绘制表面的思路本身不合理,应该绘制判别概率等于0.5的等值面,这才是两类样本的决策边界。

修正后的代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.datasets import make_classification

# 生成3特征二分类数据集
X, y = make_classification(n_features=3, n_informative=2, n_redundant=0, n_repeated=0, random_state=0)

# 拟合QDA模型
qda = QuadraticDiscriminantAnalysis()
qda.fit(X, y)

# 初始化3D绘图
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

# 设置网格范围
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
z_min, z_max = X[:, 2].min() - 1, X[:, 2].max() + 1

# 生成网格点
xx, yy, zz = np.meshgrid(np.arange(x_min, x_max, 0.2),
                         np.arange(y_min, y_max, 0.2),
                         np.arange(z_min, z_max, 0.2))

# 计算每个网格点的预测概率(取第二类的概率)
X_grid = np.c_[xx.ravel(), yy.ravel(), zz.ravel()]
probs = qda.predict_proba(X_grid)[:, 1].reshape(xx.shape)

# 绘制原始数据散点
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.Paired, s=50, edgecolors='k')

# 绘制决策边界:概率为0.5的等值面
ax.contourf3D(xx, yy, zz, probs, levels=[0.5], cmap=plt.cm.Paired, alpha=0.3)

# 设置坐标轴标签
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.set_zlabel('Feature 3')
ax.set_title('3D QDA Decision Boundary')

plt.show()

关键改动说明

  • 用predict_proba获取每个网格点属于第二类的概率,将概率值重塑为网格形状
  • 使用contourf3D绘制概率等于0.5的等值面,这个面就是QDA的决策边界
  • 调整网格步长从0.1改为0.2,减少计算量同时保证可视化效果
  • 给散点添加边缘色,提升数据点的辨识度

内容的提问来源于stack exchange,提问作者Sunwoo Kwak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:46:13