使用matplotli包对kmeans聚类结果可视化
聚类使用sklearn包中的kmeans算法,数据使用numpy随机生成
数据生成代码如下:
1.随机生成100*2的numpy二维数组
da1=np.random.rand(100,2)
2.原数据散点图展示
x=da1[:,0]
y=da1[:,1]
plt.scatter(x,y,s=16)
#kmeans包的引入
from sklearn.cluster import KMeans
#调用
km = KMeans(n_clusters=3, random_state=0)
y_p2 = km.fit_predict(da1)
4.聚类结果散点图
plt.rcParams['font.sans-serif'] = ['SimHei']
# 使负号可以展示
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(da1[y_p2==0,0], da1[y_p2==0,1], marker='o', s=30, label='簇 1')
plt.scatter(da1[y_p2==1,0], da1[y_p2==1,1], marker='o', s=30, label='簇 2')
plt.scatter(da1[y_p2==2,0], da1[y_p2==2,1], marker='o', s=30, label='簇 3')
plt.title('K-means 聚类散点图')
5.辐射图
#计算每个簇的中心点
p1=[np.mean(da1[y_p2==0,0]),np.mean(da1[y_p2==0,1])]
p2=[np.mean(da1[y_p2==1,0]),np.mean(da1[y_p2==1,1])]
p3=[np.mean(da1[y_p2==2,0]),np.mean(da1[y_p2==2,1])]
#中心点数组
p=np.array([p1,p2,p3])
#中心点x,y坐标
p_x=list(p[:,0])
p_y=list(p[:,1])
#画出中心点
plt.scatter(p_x,p_y,marker='*', s=150,c='r')
#画出每个中心点到其簇内的折线
for i in range(len(p_x)):
zx_x=p_x[i]
zx_y=p_y[i]
point_len=len(da1[y_p2==i,])
for j in range(point_len):
point_x=da1[y_p2==i,0][j]
point_y=da1[y_p2==i,1][j]
plt.plot([point_x,zx_x],[point_y,zx_y],c='black',linewidth=0.5)
#画出每个点
plt.scatter(da1[y_p2==0,0], da1[y_p2==0,1], marker='o', s=30, label='簇 1')
plt.scatter(da1[y_p2==1,0], da1[y_p2==1,1], marker='o', s=30, label='簇 2')
plt.scatter(da1[y_p2==2,0], da1[y_p2==2,1], marker='o', s=16, label='簇 3')
plt.title('K-means 聚类')