当前位置:   article > 正文

轮廓系数法和肘部法确定Kmeans最佳K值_轮廓系数判断k的最优

轮廓系数判断k的最优

我们在使用kmeans进行聚类时,往往凭感觉确定聚类中心的个数,可以通过轮廓系数法和肘部法自动确定最佳K值,代码如下

  1. # 定义一个类实现,KMeans肘部法和轮廓系数法确定最佳聚类个数
  2. class GetSample:
  3. def __init__(self,data):
  4. self.data=data
  5. # 数据预处理
  6. def data_pre(self):
  7. self.level_sample = self.data.values
  8. scaler = StandardScaler()
  9. self.level_sample=scaler.fit_transform(self.level_sample)
  10. pca=PCA(n_components=2)
  11. self.level_sample=pca.fit_transform(self.level_sample)
  12. return self.level_sample
  13. # 肘部法确定聚类中心数
  14. def zhoubufa(self):
  15. sse_result = []
  16. K = range(1, 10)
  17. data=self.data_pre()
  18. for k in K:
  19. kmeans = KMeans(n_clusters=k)
  20. kmeans.fit(data)
  21. sse_result.append(sum(np.min(cdist(data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / data.shape[0])
  22. plt.plot(K, sse_result, 'gx-')
  23. plt.xlabel('k')
  24. plt.ylabel(u'平均畸变程度')
  25. plt.title(u'肘部法则确定最佳的K值')
  26. plt.show()
  27. # 轮廓系数法确定聚类中心数
  28. def lunkuoxishu(self):
  29. K = range(2, 10)
  30. data = self.data_pre()
  31. score = []
  32. for k in K:
  33. kmeans = KMeans(n_clusters=k)
  34. kmeans.fit(data)
  35. score.append(silhouette_score(data, kmeans.labels_, metric='euclidean'))
  36. plt.plot(K, score, 'r*-')
  37. plt.xlabel('k')
  38. plt.ylabel(u'轮廓系数')
  39. plt.title(u'轮廓系数确定最佳的K值')
  40. plt.show()
  41. # 根据获取的最佳聚类中心数量,对样本数据进行聚类,并对数据进行降维进行可视化展示
  42. def get_cluter(n,data):
  43. data=data
  44. n_clusters=n
  45. cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(data)
  46. y_pred=cluster.labels_
  47. centorid = cluster.cluster_centers_
  48. #color = ['r', 'b', 'c', 'g', 'y', 'liac','peach','beige','salmon','mauve']
  49. color = ['r', 'b', 'c', 'g', 'y', 'm','k','lime','cyan','brown']
  50. fig, ax1 = plt.subplots(1)
  51. for i in range(n_clusters):
  52. ax1.scatter(data[y_pred == i, 0], data[y_pred == i, 1]
  53. , marker='o'
  54. , s=8
  55. , c=color[i]
  56. )
  57. ax1.scatter(centorid[:, 0], centorid[:, 1]
  58. , marker='*'
  59. , s=20
  60. , c='black'
  61. )
  62. plt.show()
  63. return y_pred

运行结果

聚类结果可视化

轮廓系数法运算量较大,因此对原始数据进行主成分分析。如上所示,选择最佳的K为6,其中轮廓系数法的结果比较明显,肘部法不是那么明显,但是肘部法的运算速度要快很多 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/132355
推荐阅读
  

闽ICP备14008679号