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

SVM超平面绘图时数据点不显示且报KeyError: 0问题求助

问题分析与解决

核心问题

  1. KeyError: 0:你用X[i][0]访问数据,但X大概率是pandas DataFrame结构,这种索引方式不适用DataFrame。你已经把X_train转成numpy数组存在X1里了,直接用X1更合适。
  2. 数据点只显示3个:循环只跑了range(3),只遍历了前3个样本,自然看不到全部数据。
  3. 图例重复冗余:每次循环都添加label,会导致图例里出现多个重复的"negative"/"positive"条目。

修改后的代码

clf = SVC(gamma='auto', kernel='linear')
X1 = X_train.values
Y1 = y_train.values
clf.fit(X1, Y1)

# 绘制决策边界相关线条
w = clf.coef_[0]
a = -w[0] / w[1]

xx = np.linspace(0, 12)
yy = a * xx - clf.intercept_[0] / w[1]
y_neg = a * xx - clf.intercept_[0] / w[1] + 1
y_pos = a * xx - clf.intercept_[0] / w[1] - 1

plt.figure(1, figsize=(15, 10))
plt.plot(xx, yy, 'k',
         label=f"Decision Boundary (0 = {w[0]}x1 + {w[1]}x2 + {clf.intercept_[0]})")
plt.plot(xx, y_neg, 'b-.',
         label=f"Neg Decision Boundary (-1 = {w[0]}x1 + {w[1]}x2 + {clf.intercept_[0]})")
plt.plot(xx, y_pos, 'r-.',
         label=f"Pos Decision Boundary (1 = {w[0]}x1 + {w[1]}x2 + {clf.intercept_[0]})")

# 批量绘制全部数据点
# 先筛选两类样本
neg_samples = X1[Y1 == 0]
pos_samples = X1[Y1 == 1]

# 一次性绘制,避免循环重复添加label
plt.scatter(neg_samples[:, 0], neg_samples[:, 1], color='red', marker='o', label='negative')
plt.scatter(pos_samples[:, 0], pos_samples[:, 1], color='green', marker='x', label='positive')

plt.legend()
plt.show()

修改说明

  • 改用X1(numpy数组)访问数据,数组支持[:,0]这种切片方式,直接批量获取特征列,彻底避免索引错误。
  • 去掉循环,用布尔索引筛选两类样本后批量绘制,既高效又简洁,同时label只添加一次,图例不会重复。
  • 修正了决策边界公式的表述,让等式逻辑更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:15:05