基于Iris数据集LDA降维后绘制三类决策边界的报错求助
解决Iris数据集LDA降维后绘制决策边界的问题
问题描述
我正在使用Iris数据集,希望绘制三类样本的分类边界/区域。首先通过以下代码将所有特征降维至2个LDA分量并完成数据点绘图:
# Load the Iris dataset iris = load_iris() X = iris.data y = iris.target # Perform LDA lda = LinearDiscriminantAnalysis() X_lda = lda.fit_transform(X, y) # Plot the data points cmap = ListedColormap(['red', 'green', 'blue']) for target, color, marker in zip(np.unique(y), ['r', 'g', 'b'], ['s', 'x', 'o']): plt.scatter(X_lda[y == target, 0], X_lda[y == target, 1], c=color, cmap=cmap, marker=marker, label=target, edgecolors='black') # Set plot labels and limits plt.title('Linear Discriminant Analysis (Iris Dataset)') plt.xlabel('LDA Component 1') plt.ylabel('LDA Component 2') plt.legend()
结果如下图所示:
尝试绘制决策边界时使用以下代码:
# Define the decision boundary x1_min, x1_max = X_lda[:, 0].min() - 1, X_lda[:, 0].max() + 1 x2_min, x2_max = X_lda[:, 1].min() - 1, X_lda[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02)) Z = lda.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape)
出现报错:ValueError: X has 2 features, but LinearDiscriminantAnalysis is expecting 4 features as input。如何绘制这三类之间的决策边界?
错误原因
你训练的lda模型是基于原始4维特征拟合的,它的predict方法只能接收4维数据;而你传入的是降维后的2维LDA分量,维度不匹配,因此报错。
解决方案
我们需要在降维后的2维空间上重新训练一个分类器,用它来预测网格点的类别,从而绘制决策边界。这里选择用LinearDiscriminantAnalysis(LDA本身也是分类器),步骤如下:
完整代码示例
from sklearn.datasets import load_iris from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from matplotlib.colors import ListedColormap import numpy as np import matplotlib.pyplot as plt # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 第一步:LDA降维到2维 lda_dim_reduce = LinearDiscriminantAnalysis(n_components=2) X_lda = lda_dim_reduce.fit_transform(X, y) # 第二步:在降维后的2维数据上训练新的LDA分类器 lda_classifier = LinearDiscriminantAnalysis() lda_classifier.fit(X_lda, y) # 生成网格点 x1_min, x1_max = X_lda[:, 0].min() - 1, X_lda[:, 0].max() + 1 x2_min, x2_max = X_lda[:, 1].min() - 1, X_lda[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02)) # 用训练好的2维分类器预测网格点类别 Z = lda_classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape) # 绘制决策边界区域 cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) plt.contourf(xx1, xx2, Z, cmap=cmap_light, alpha=0.8) # 绘制原始散点 cmap_bold = ListedColormap(['red', 'green', 'blue']) for target, color, marker in zip(np.unique(y), ['r', 'g', 'b'], ['s', 'x', 'o']): plt.scatter(X_lda[y == target, 0], X_lda[y == target, 1], c=color, cmap=cmap_bold, marker=marker, label=target, edgecolors='black') # 设置图表属性 plt.title('LDA降维后的Iris数据集决策边界') plt.xlabel('LDA Component 1') plt.ylabel('LDA Component 2') plt.legend() plt.show()
代码说明
- 拆分两个LDA模型:
lda_dim_reduce负责将原始4维数据降维到2维,lda_classifier基于降维后的2维数据训练,用于分类预测。 - 使用
contourf绘制决策边界的填充区域,让分类区域更直观。 - 保留原有散点绘图逻辑,确保数据点和边界对应。
内容的提问来源于stack exchange,提问作者user20216792
相关产品推荐
相关产品推荐

