使用Python的sklearn包做kmeans
9,740 阅读
首先要安装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 ():
avg = np.mean(original_data, axis=)
dist = np.power(original_data - avg, )
total_ss = np.(dist)
within_squares = np.zeros((n_clusters, (original_data[])))
i (, (original_data)):
cluster = predict_labels[i]
within_squares[cluster] += np.power(original_data[i] - cluster_centers[cluster], )
within_ss = np.(within_squares)
(total_ss - within_ss) / total_ss
X = np.loadtxt(, delimiter=)
kmeans = KMeans(n_clusters=, random_state=).fit(X)
sil_coeff = silhouette_score(X, kmeans.labels_, metric=)
bss = sum_of_square_scores(X, kmeans.labels_, kmeans.cluster_centers_, kmeans.n_clusters)
( + (sil_coeff))
( + (bss))
