SVM超平面绘图时数据点不显示且报KeyError: 0问题求助
问题分析与解决
核心问题
- KeyError: 0:你用
X[i][0]访问数据,但X大概率是pandas DataFrame结构,这种索引方式不适用DataFrame。你已经把X_train转成numpy数组存在X1里了,直接用X1更合适。 - 数据点只显示3个:循环只跑了
range(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
相关产品推荐
相关产品推荐

