赞
踩
我们在使用kmeans进行聚类时,往往凭感觉确定聚类中心的个数,可以通过轮廓系数法和肘部法自动确定最佳K值,代码如下
- # 定义一个类实现,KMeans肘部法和轮廓系数法确定最佳聚类个数
- class GetSample:
- def __init__(self,data):
- self.data=data
-
- # 数据预处理
- def data_pre(self):
- self.level_sample = self.data.values
- scaler = StandardScaler()
- self.level_sample=scaler.fit_transform(self.level_sample)
- pca=PCA(n_components=2)
- self.level_sample=pca.fit_transform(self.level_sample)
- return self.level_sample
-
-
-
- # 肘部法确定聚类中心数
- def zhoubufa(self):
- sse_result = []
- K = range(1, 10)
- data=self.data_pre()
- for k in K:
- kmeans = KMeans(n_clusters=k)
- kmeans.fit(data)
- sse_result.append(sum(np.min(cdist(data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / data.shape[0])
- plt.plot(K, sse_result, 'gx-')
- plt.xlabel('k')
- plt.ylabel(u'平均畸变程度')
- plt.title(u'肘部法则确定最佳的K值')
- plt.show()
-
- # 轮廓系数法确定聚类中心数
- def lunkuoxishu(self):
- K = range(2, 10)
- data = self.data_pre()
- score = []
- for k in K:
- kmeans = KMeans(n_clusters=k)
- kmeans.fit(data)
- score.append(silhouette_score(data, kmeans.labels_, metric='euclidean'))
- plt.plot(K, score, 'r*-')
- plt.xlabel('k')
- plt.ylabel(u'轮廓系数')
- plt.title(u'轮廓系数确定最佳的K值')
- plt.show()
-
-
- # 根据获取的最佳聚类中心数量,对样本数据进行聚类,并对数据进行降维进行可视化展示
- def get_cluter(n,data):
- data=data
- n_clusters=n
- cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(data)
- y_pred=cluster.labels_
- centorid = cluster.cluster_centers_
-
- #color = ['r', 'b', 'c', 'g', 'y', 'liac','peach','beige','salmon','mauve']
- color = ['r', 'b', 'c', 'g', 'y', 'm','k','lime','cyan','brown']
- fig, ax1 = plt.subplots(1)
- for i in range(n_clusters):
- ax1.scatter(data[y_pred == i, 0], data[y_pred == i, 1]
- , marker='o'
- , s=8
- , c=color[i]
- )
- ax1.scatter(centorid[:, 0], centorid[:, 1]
- , marker='*'
- , s=20
- , c='black'
-
- )
- plt.show()
- return y_pred
-
-
运行结果
聚类结果可视化
轮廓系数法运算量较大,因此对原始数据进行主成分分析。如上所示,选择最佳的K为6,其中轮廓系数法的结果比较明显,肘部法不是那么明显,但是肘部法的运算速度要快很多
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。