散点分类(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时的评分
对比可知,分成四类效果最好,这正好与我们最开始的分类相照应。

浙公网安备 33010602011771号