散点分类(kmeans)

1 from numpy.random import RandomState
2 from sklearn.datasets import make_blobs
3 import matplotlib.pyplot as plt
4 from sklearn.cluster import KMeans
5 X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

我们生成500个样本,每个样本有两个特征,所有样本一共被分为4类(假设我们并不知道他们有多少类)。

 1 from sklearn.cluster import KMeans
 2 n_clusters=3  #现在暂定分为3类
 3 cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(X[:200])   
 4 # 取前200行数据进行训练
 5 pre=cluster.labels_    #前200行数据分类结果
 6 centers=cluster.cluster_centers_    #根据前200行数据计算出来最终的质心    
 7 pre2=cluster.predict(X)    # 根据上面的质心预测所有数据
 8 pre3=cluster.fit_predict(X)    # 根据所有数据而不是200行,进行训练预测
 9 clusterall=KMeans(n_clusters=3,random_state=0).fit(X)
10 preall=clusterall.predict(X)
11 preall2=clusterall.fit_predict(X)

clusterall是根据所有数据进行训练,preall和preall2是预测结果,它们应该和pre3完全一致。当数据过多时,算法需要不断调整质心,时间复杂度很高,我们可以选取部分数据进行训练,能得到一个较好的训练结果。

1 cluster.cluster_centers_
2 cluster.inertia_

这是k-means里面两个重要的属性:质心坐标和总距离平方和.

     图1-1 训练200条数据所得三个质心        图1-2 根据当前三个质心所得总距离平方和

 可视化处理

1 from sklearn.cluster import KMeans
2 n_clusters=3
3 cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(X)
4 pre=cluster.predict(X)
5 centers=cluster.cluster_centers_

这次我们训练所有数据,centers是最终质心。

1 plt.figure(figsize=(16,8))
2 for  i in range(n_clusters):
3     plt.scatter(X[pre==i,0],X[pre==i,1],c=np.array(plt.cm.tab10(i/(n_clusters-1))).reshape(1,-1) ,label=i)
4 plt.scatter(centers[:,0],centers[:,1],marker='x',s=50,c='black')
5 plt.legend()

       图 1-3 n_cluster为3 样本分类及对应质心      

      图 1-4 n_cluster为4 样本分类及对应质心

  

   图 1-5 ncluster为4 对应inertia

可以看出,分成四类比分成三类总距离平方和要小,但不代表分成四类一定好,实际上当分成500类时,总距离平方和可以为0.所以我们不能根据inertia的大小来衡量聚类算法的优劣.

聚类我们希望一类的差异小,不同类的差异大.

1 from sklearn.metrics import silhouette_samples
2 from sklearn.metrics import silhouette_score
3 silhouette_score(X,pre)

     图1-6 cluster为3时的评分                                      

     图1-7 cluster为4时的评分

     图1-8 cluster为5时的评分

对比可知,分成四类效果最好,这正好与我们最开始的分类相照应。

 

posted @ 2021-10-02 15:03  李点  阅读(597)  评论(0)    收藏  举报