参考文章:
https://blog.csdn.net/a841454735/article/details/80237257
http://blog.sina.com.cn/s/blog_65c8baf901016flh.html
Davies-Bouldin指数(DBI)(戴维森堡丁指数),又称为分类适确性指标,是由大卫L·Davies和唐纳德·Bouldin提出的一种评估聚类算法优劣的指标。
属于内部指标,内部指标是利用数据集的固有特征和量值来评价一个聚类算法的结果。
基于DBI指数的k-means算法无需指定K的值,而是给出K的范围,由算法自动确定最适合的K值。
S i = { 1 T i ∑ j = 1 T i ∣ X j − A i ∣ q } 1 q S_i=\{\frac{1}{T_i}\sum_{j=1}^{T_i}|X_j-A_i|^q\}^{\frac{1}{q}} Si={Ti1j=1∑Ti∣Xj−Ai∣q}q1
X j X_j Xj:第i类中第j个数据点
A i A_i Ai:第i类的中心数据点
当q=1:表示各点到中心距离的均值
当q=2:表示各点到中心距离的标准差
【用来衡量离散程度】
M i j = ∑ k = 1 N ∣ a k i − a k j ∣ p } 1 p M_{ij}=\sum_{k=1}^{N}|a_{ki}-a_{kj}|^p\}^{\frac{1}{p}} Mij=k=1∑N∣aki−akj∣p}p1
a k i a_{ki} aki:表示第i类的中心点的第k个属性的值
当p=1:表示各点到中心距离的均值
当p=2:表示各点到中心距离的标准差
【用来衡量离散程度】
R i j = S i + S j M i j R_{ij}=\frac{S_i+S_j}{M_{ij}} Rij=MijSi+Sj
R i = m a x ( R i 1 , R i 2 , . . . R i j , . . . R i N ) , i ≠ j R_i=max(R_{i1},R_{i2}, ...R_{ij}, ...R_{iN}) ,i≠j Ri=max(Ri1,Ri2,...Rij,...RiN),i=j
分类个数的不同(N不同),会导致 R ‾ \overline{R} R不同, R ‾ \overline{R} R值越小,分类效果越好。
def vectorDistance(v1, v2):
"""
this function calculates de euclidean distance between two
vectors.
"""
sum = 0
for i in range(len(v1)):
sum += (v1[i] - v2[i]) ** 2
return sum ** 0.5
def compute_Si(i, x, clusters, nc):
norm_c = nc
s = 0
for t in x[i]:
s += vectorDistance(t, clusters)
return s / norm_c
def compute_Rij(i, j, x, clusters, nc):
Mij = vectorDistance(clusters[i], clusters[j])
Rij = (compute_Si(i, x, clusters[i], nc) + compute_Si(j, x, clusters[j], nc)) / Mij
return Rij
def compute_Di(i, x, clusters, nc):
list_r = []
for j in range(nc):
if i != j:
temp = compute_Rij(i, j, x, clusters, nc)
list_r.append(temp)
return max(list_r)
def compute_DB_index(x, clusters, nc):
sigma_R = 0.0
for i in range(nc):
sigma_R = sigma_R + compute_Di(i, x, clusters, nc)
DB_index = float(sigma_R) / float(nc)
return DB_index