Davies-Bouldin Index (戴维斯-博尔丁指数)
简介
概念与定义
Davies-Bouldin Index是由David L. Davies和Donald W. Bouldin于1979年提出的一种用于评估聚类算法效果的内部指标。它通过计算每个簇内数据点之间的相似性和不同簇中心点的距离来衡量聚类结果的质量。DBI的值越低,表明聚类的效果越好。
计算方法
对于给定的数据集和其划分成的k个簇,DBI的计算公式如下:
DB=1k∑i=1kmaxj≠i(σi+σjd(ci,cj))DB = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \left( \frac{\sigma_i + \sigma_j}{d(c_i, c_j)} \right)DB=k1i=1∑kj=imax(d(ci,cj)σi+σj)
其中,(\sigma_i)代表第(i)个簇内数据点到该簇中心点的平均距离,(c_i)是第(i)个簇的中心点,而(d(c_i, c_j))表示簇(i)和簇(j)中心点之间的距离。
使用场景
数据探索阶段
在数据分析的初期阶段,当尝试理解数据结构并寻找合适的聚类数时,DBI可以作为一种有效的工具来评估不同的聚类方案。
选择最佳聚类数
DBI常被用来比较不同数量的簇所得到的聚类效果,帮助确定最佳的簇数量。
优点
直观易懂
DBI的计算基于简单的数学概念,易于理解和实现。
缺点
对非球形簇的限制
由于DBI依赖于簇内点间距离和簇中心点间的距离,因此对于形状不规则或大小差异较大的簇,DBI可能无法提供准确的评价。
sklearn.metrics.davies_bouldin_score函数
sklearn.metrics.davies_bouldin_score
是用于评估聚类效果的一个指标,基于Davies-Bouldin Index来衡量聚类质量。该分数越低,表示聚类效果越好。
核心作用
- 评估聚类算法的效果,通过计算簇内相似性与簇间分离度的比率。
函数参数
X
: {array-like, sparse matrix} of shape (n_samples, n_features)- 特征数组或矩阵。
labels
: array-like of shape (n_samples,)- 每个样本的类别标签。
返回值
score
: float- Davies-Bouldin Index的值,数值越低表示聚类效果越好。
内部数学形式
对于每个簇CiC_iCi,定义其平均距离到其他点的距离为:
Rij=σi+σjd(μi,μj)R_{ij} = \frac{\sigma_i + \sigma_j}{d(\mu_i, \mu_j)}Rij=d(μi,μj)σi+σj
其中,
-σi\sigma_iσi是簇CiC_iCi的标准差(或簇内散度)。
- μi\mu_iμi 是簇CiC_iCi的质心。
- d(μi,μj)d(\mu_i, \mu_j)d(μi,μj)是两个簇质心间的欧几里得距离。
最终的Davies-Bouldin指数为所有簇对的最大RijR_{ij}Rij值的平均。
示例代码
python
from sklearn.cluster import KMeans
from sklearn.metrics import davies_bouldin_score
from sklearn.datasets import make_blobs
# 创建模拟数据集
X, _ = make_blobs(n_samples=1000, centers=5, n_features=2, random_state=42)
# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=5, random_state=42).fit(X)
# 计算Davies-Bouldin指数
db_index = davies_bouldin_score(X, kmeans.labels_)
print(f"Davies-Bouldin Index: {db_index}")
输出
python
Calinski-Harabasz 指数: 2157.53
代码说明
make_blobs
: 生成一个具有预设簇结构的二维数据集,便于演示。KMeans
: 使用 K-Means 算法进行聚类。n_init=10
确保算法运行10次并选择最优结果。calinski_harabasz_score(X, cluster_labels)
:X
: 输入的数据特征矩阵。cluster_labels
: 聚类算法产生的标签。- 该函数计算并返回 Calinski-Harabasz 指数。
- 输出: 打印出计算得到的指数值。