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

基于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()

结果如下图所示:
Iris数据集LDA降维散点图

尝试绘制决策边界时使用以下代码:

# 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()

代码说明

  1. 拆分两个LDA模型:lda_dim_reduce负责将原始4维数据降维到2维,lda_classifier基于降维后的2维数据训练,用于分类预测。
  2. 使用contourf绘制决策边界的填充区域,让分类区域更直观。
  3. 保留原有散点绘图逻辑,确保数据点和边界对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:42:13