Python实现K-means聚类散点图时X位置切片报错问题求解
K-means聚类绘图代码报错排查
报错原因
X[:,0]是numpy数组的按位置索引语法,而你代码里的X是pandas DataFrame对象,不支持这种二维位置切片写法,因此该行代码运行失败。KMeans训练步骤没有报错是因为scikit-learn的模型接口兼容pandas DataFrame输入,训练时会自动将其转换为numpy数组处理,不需要手动做格式转换。
你替换成直接取df列的写法能正常运行,是因为传入的pandas Series对象是matplotlib原生支持的输入格式。
修复方案
二选一即可:
- 方案1:使用pandas自带的位置索引器
iloc适配DataFrame的索引规则,不需要修改X的定义# 把原来报错的那行替换成这行 plt.scatter(X.iloc[:,0], X.iloc[:,1]) - 方案2:将X转换为numpy数组后再用位置索引,两种写法都可以
# 写法1:绘图时临时转numpy plt.scatter(X.to_numpy()[:,0], X.to_numpy()[:,1]) # 写法2:定义X的时候直接转成numpy数组,后续所有操作都按numpy数组语法写 X = df[['List Agency Code', 'Exam No']].copy().to_numpy()
优化建议
绘制样本散点时可以增加c=pred_y参数,自动给不同聚类簇的样本分配不同颜色,聚类效果更直观:
plt.scatter(X.iloc[:,0], X.iloc[:,1], c=pred_y, cmap='viridis')
修正后完整代码
X = df[['List Agency Code', 'Exam No']].copy() kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0) pred_y = kmeans.fit_predict(X) plt.scatter(X.iloc[:,0], X.iloc[:,1], c=pred_y, cmap='viridis') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red') plt.show()
内容的提问来源于stack exchange,提问作者Emy
相关产品推荐
相关产品推荐

