使用Python的sklearn包做kmeans
首先要安装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聚类并分析结果
代码如下:
from sklearn.cluster import KMeans
import numpy as np
from sklearn.metrics import silhouette_score
# 定义between_SS / total_SS 的计算方法
def sum_of_square_scores(original_data, predict_labels, cluster_centers, n_clusters):
avg = np.mean(original_data, axis=0)
dist = np.power(original_data - avg, 2)
total_ss = np.sum(dist)
within_squares = np.zeros((n_clusters, len(original_data[0])))
for i in range(0, len(original_data)):
cluster = predict_labels[i]
within_squares[cluster] += np.power(original_data[i] - cluster_centers[cluster], 2)
within_ss = np.sum(within_squares)
return (total_ss - within_ss) / total_ss
# 载入数据
X = np.loadtxt("D:/data/kmeans.txt", delimiter=' ')
# 运行KMeans
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
# 使用Silhouette Coefficient评价
sil_coeff = silhouette_score(X, kmeans.labels_, metric='euclidean')
# 使用between_ss / total_ss 评价
bss = sum_of_square_scores(X, kmeans.labels_, kmeans.cluster_centers_, kmeans.n_clusters)
print("coeff:" + str(sil_coeff))
print("between_ss / total_ss:" + str(bss))
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
