使用聚类算法后,比如k-means,要评价聚类的效果如何,可以用以下指标。
评价聚类模型好的标准:同一簇类的数据集尽可能密集,不同簇类的数据集尽可能远离。
(1)轮廓系数
1.计算当前簇类凝聚度:当前簇类的样本i到其簇类内所有其他样本的距离的平均值,记为a。
2.计算当前簇类与邻居簇类的分离度:样本i到邻居簇类(最近那个)内所有样本的距离的平均值,记为b。由于不知道哪一个簇类是邻居簇类,所以要遍历其他各个簇类,选择距离平均值最小的簇类作为邻居簇类。
3.对于样本i,计算轮廓系数:
4.计算当前簇类内的所有样本的轮廓系数的平均值,作为当前簇类的轮廓系数。
值会在(-1,1),不难发现若s小于0,说明分离度b小于聚合度a,表示聚类效果不好。我们希望分离度要大,聚合度要小,即b>>a,这样聚类效果比较好。
代码:
from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn import datasets
# 生成数据集
dataset = datasets.load_iris()
X = dataset.data
y = dataset.target
# 构建K均值聚类模型
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_
# 轮廓系数
metrics.silhouette_score(X, labels, metric='euclidean')
(2) DB指数(Davies-Bouldin Index)
1.计算各个簇类的凝聚度:
2.计算各个簇类之间的分离度:
其中,是簇类中心。
3.计算DB指数:
DB指数越小说明聚类效果越好。DB指数的计算比轮廓系数简单;DB指数的计算只需要知道数据集的数量和特征。
(3)CH指数
直接上代码:
from sklearn import metrics
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_
metrics.calinski_harabaz_score(X, labels)
当簇类密集且簇间分离较好时,Caliniski-Harabaz分数越高,聚类性能越好。