新手求教:如何绘制K-Means聚类图并导出画布?
K-Means新手问题解答:聚类图绘制与画布导出
你的现有代码
import numpy as np import matplotlib.pyplot as plt from scipy.spatial.distance import cdist # gonna change k into a input np.random.seed(14) n = 20 p = 3 k = 3 x = np.random.random((n,p)) plt.scatter(x[:,0], x[:,1]) centers = x[np.random.choice(n, k, replace=False)] ((x[0]-centers[0])**2).sum()**0.5 ((x-centers[0])**2).sum(axis=1) ((x.reshape(n,1,p)-centers.reshape(1,k,p))**2).sum(axis=2)**0.5 distances = np.zeros((n,k)) for i in range(k): distances[:,i] = ((x-centers[i])**2).sum(axis=1)**0.5 distances distances = cdist(x, centers) closest = np.argmin(distances, axis=1) x[closest == 0].mean(axis=0) for i in range (k): centers[i, :] = x[closest == i].mean(axis=0) centers np.random.seed(4160659) centers = x[np.random.choice(n, k, replace=False)] closest = np.zeros(n).astype(int) while True: old_closest = closest.copy() print(closest) distances = cdist(x, centers) closest = np.argmin(distances, axis=1) for i in range (k): centers[i, :] = x[closest == i].mean(axis=0) if all(closest == old_closest): break plt.scatter(x[:,0],x[:,1],c=closest) plt.xlabel('age') plt.ylabel('income ($)')
1. 如何绘制K-Means聚类图?
你代码最后一行的plt.scatter(x[:,0],x[:,1],c=closest)其实已经完成了基础聚类图的绘制——c=closest会根据每个样本所属的簇,给点染上不同颜色,直接区分开各个聚类。
如果想让图更直观,还可以加几个实用优化:
- 标记聚类中心:把计算出的聚类中心用更显眼的样式画出来,比如红色大叉,一眼就能看到每个簇的核心位置:
plt.scatter(centers[:,0], centers[:,1], c='red', marker='X', s=200, label='聚类中心') - 添加图例:让看图的人明确知道不同元素的含义:
plt.legend() - 添加标题:给图加个清晰的主题,方便理解:
plt.title('K-Means聚类结果(年龄vs收入)')
把这些补充到你现有绘图代码后,最终的绘图段会变成:
plt.scatter(x[:,0],x[:,1],c=closest) plt.scatter(centers[:,0], centers[:,1], c='red', marker='X', s=200, label='聚类中心') plt.xlabel('age') plt.ylabel('income ($)') plt.title('K-Means聚类结果(年龄vs收入)') plt.legend() # 需要显示图的话就加下面这句 # plt.show()
2. 如何导出(打印)画布?
用Matplotlib自带的plt.savefig()函数就能直接把画布导出成图片文件,操作非常简单:
在所有绘图代码的最后(注意要放在plt.show()之前,因为plt.show()会清空画布)添加这句:
plt.savefig('kmeans聚类图.png', dpi=300, bbox_inches='tight')
参数说明:
'kmeans聚类图.png':自定义的保存文件名和格式,支持png、jpg、pdf等,改后缀即可切换格式。dpi=300:设置图片分辨率,数值越高越清晰,300dpi足够用于打印或高清分享。bbox_inches='tight':避免图中的轴标签、标题被切掉,保证完整导出所有内容。
内容的提问来源于stack exchange,提问作者Aahil Ahmed
相关产品推荐
相关产品推荐

