代碼如下:
""" 下面的方法是用kmeans方法進行聚類,用calinski_harabaz_score方法評價聚類效果的好壞 大概是類間距除以類內距,因此這個值越大越好 """ import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs from sklearn.cluster import KMeans from sklearn import metrics """ 下面是生成一些樣本數據 X為樣本特征,Y為樣本簇類別, 共1000個樣本,每個樣本2個特征,共4個簇,簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分別為[0.4, 0.5, 0.2] """ X, y = make_blobs(n_samples=500, n_features=2, centers=[[2,3], [3,0], [1,1]], cluster_std=[0.4, 0.5, 0.2], random_state =9) """ 首先畫出生成的樣本數據的分布 """ plt.scatter(X[:, 0], X[:, 1], marker='o') plt.show() """ 下面看不同的k值下的聚類效果 """ score_all=[] list1=range(2,6) #其中i不能為0,也不能為1 for i in range(2,6): y_pred = KMeans(n_clusters=i, random_state=9).fit_predict(X) #畫出結果的散點圖 plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() score=metrics.calinski_harabaz_score(X, y_pred) score_all.append(score) print(score) """ 畫出不同k值對應的聚類效果 """ plt.plt(list1,score_all) plt.show()
原來的數據分布圖為:
k=2時,聚類情況:
k=3時,聚類情況:
k=4時的聚類效果:
k=5時的聚類效果:
不同k值對應的聚類效果折線圖:
我們可以看到,k=3時,哪個值最大,效果最好。