如何绘制带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
相关产品推荐
相关产品推荐

