使用Python的sklearn包做kmeans

标签:#kmeans##python##编程# 时间:2018/10/31 14:42:14 作者:小木

首先要安装numpy和sklearn包,然后运行sklearn的kmeans方法即可。
这里我们使用了三种评价方法,一种是

1、Silhouette Coefficient

Silhouette Coefficient是对聚类方法进行解释和验证一致性的方法。该技术提供了一个简洁的图形表示,表明每个对象在其集群中的位置。

Silhouette Coefficient是对象与其自身簇(内聚力)相比与其他簇(分离)相似程度的度量。 值从-1到+1,其中高值表示对象与其自己的簇很好地匹配并且与相邻簇不匹配。 如果大多数对象具有高值,则聚类结果是合适的。 如果许多点具有低值或负值,则聚类效果不好,可能具有太多或太少的簇。

可以使用任何距离度量来计算Silhouette Coefficient结果,例如欧几里德距离或曼哈顿距离。

2.Rand Index

Rand索引计算集群(由聚类算法返回)与基准分类的相似程度。 人们还可以将Rand指数视为算法所做出的正确决策百分比的度量。 它可以使用以下公式计算:

RI = \frac{TP+TN}{TP+FP+FN+TN}

这里的TP是真实的正值数量,TN是真实的负值数量,FP是错误正值的数量,FN是错误负值的数量。

3. between_ss / total_ss

这个是组间距离平方和和总的距离平方和之比,是R语言中KMeans内置的一个评价方法,见使用R语言进行K-means聚类并分析结果

代码如下:

  1. from sklearn.cluster import KMeans
  2. import numpy as np
  3. from sklearn.metrics import silhouette_score
  4. # 定义between_SS / total_SS 的计算方法
  5. def sum_of_square_scores(original_data, predict_labels, cluster_centers, n_clusters):
  6. avg = np.mean(original_data, axis=0)
  7. dist = np.power(original_data - avg, 2)
  8. total_ss = np.sum(dist)
  9. within_squares = np.zeros((n_clusters, len(original_data[0])))
  10. for i in range(0, len(original_data)):
  11. cluster = predict_labels[i]
  12. within_squares[cluster] += np.power(original_data[i] - cluster_centers[cluster], 2)
  13. within_ss = np.sum(within_squares)
  14. return (total_ss - within_ss) / total_ss
  15. # 载入数据
  16. X = np.loadtxt("D:/data/kmeans.txt", delimiter=' ')
  17. # 运行KMeans
  18. kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
  19. # 使用Silhouette Coefficient评价
  20. sil_coeff = silhouette_score(X, kmeans.labels_, metric='euclidean')
  21. # 使用between_ss / total_ss 评价
  22. bss = sum_of_square_scores(X, kmeans.labels_, kmeans.cluster_centers_, kmeans.n_clusters)
  23. print("coeff:" + str(sil_coeff))
  24. print("between_ss / total_ss:" + str(bss))
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
Back to Top