• 聚类算法评价指标——基于DBI指数的k-means算法(python代码)


    参考文章:
    https://blog.csdn.net/a841454735/article/details/80237257
    http://blog.sina.com.cn/s/blog_65c8baf901016flh.html

    1 DBI指数介绍

    Davies-Bouldin指数(DBI)(戴维森堡丁指数),又称为分类适确性指标,是由大卫L·Davies和唐纳德·Bouldin提出的一种评估聚类算法优劣的指标。

    属于内部指标,内部指标是利用数据集的固有特征和量值来评价一个聚类算法的结果。

    2 优点

    基于DBI指数的k-means算法无需指定K的值,而是给出K的范围,由算法自动确定最适合的K值。

    3 定义值

    3.1 S i S_i Si:表示第i类中,数据点的分散程度

    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=1TiXjAiq}q1

    X j X_j Xj:第i类中第j个数据点
    A i A_i Ai:第i类的中心数据点

    当q=1:表示各点到中心距离的均值
    当q=2:表示各点到中心距离的标准差
    【用来衡量离散程度】

    3.2 M i j M_{ij} Mij:表示第i类与第j类的距离

    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=1Nakiakjp}p1

    a k i a_{ki} aki:表示第i类的中心点的第k个属性的值

    当p=1:表示各点到中心距离的均值
    当p=2:表示各点到中心距离的标准差
    【用来衡量离散程度】

    3.3 R i j R_{ij} Rij:表示第i类和第j类的相似度

    R i j = S i + S j M i j R_{ij}=\frac{S_i+S_j}{M_{ij}} Rij=MijSi+Sj

    3.4 R ‾ \overline{R} R:DBI指数,越小分类效果越好

    1. 先计算 R i R_i Ri,i=1,2,3…N
      即求类i与其他类的最大相似值。

    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

    1. 再计算每个类的最大相似度的均值,得到 R ‾ \overline{R} R,即DBI指数。
      D B I = R ‾ = 1 N ∑ i = 1 N R i DBI =\overline{R}=\frac{1}{N}\sum_{i=1}^{N}R_i DBI=R=N1i=1NRi

    分类个数的不同(N不同),会导致 R ‾ \overline{R} R不同, R ‾ \overline{R} R值越小,分类效果越好。

    4 这篇博文公式挺多挺费事的,觉得有用的话可以点击收藏关注~~点赞是我更新的无限动力!!

    5 python代码实现

    • 代码来自参考博文里面的博主写的~
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    达梦数据库如何查看历史sql
    把Mybatis Generator生成的代码加上想要的注释
    MySQL主从复制
    Explain执行计划字段解释说明---type字段说明(01)
    网规配置案例分析——国庆
    Speeded-Up Robust Features (SURF)全文翻译
    leetcode:66. 加一
    4-11 Isomorphic
    Linux虚拟化指南:构建虚拟化环境
    [NOIP2002 普及组] 产生数
  • 原文地址:https://blog.csdn.net/weixin_42521185/article/details/125866386