• 【转】层次聚类python,scipy(dendrogram, linkage,fcluster函数)



    原文链接:https://blog.csdn.net/weixin_42887138/article/details/117708688

    1. 案例分析

    这里,我们来解读一下scipy中给出的层次聚类scipy.cluster.hierarchy的示例:

    import numpy as np
    from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
    from matplotlib import pyplot as plt
    
    X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
    Z = linkage(X, method='centroid')
    f = fcluster(Z,t=3,criterion='distance')
    fig = plt.figure(figsize=(5, 3))
    dn = dendrogram(Z)
    print('Z:\n', Z)
    print('f:\n', f)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    可以得到输出结果:

    Z:
     [[ 2.          7.          0.          2.        ]
     [ 5.          6.          0.          2.        ]
     [ 1.          9.          1.          3.        ]
     [ 4.          8.          1.          3.        ]
     [ 0.         11.          1.66666667  4.        ]
     [ 3.         12.          3.25        5.        ]
     [10.         13.          7.26666667  8.        ]] (7 × 4)
    f:
     [2 1 2 3 2 1 1 2]  (1 ×)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    f 代表了 [2, 8, 0, 4, 1, 9, 9, 0] 的每一个元素属于哪一个类别,这里设置了 3 类。如果想要5类的话,就可以在 fcluster 函数中的 t 参数设置为 t=5 即可。

    关于 Z 矩阵的意义

    由于层次聚类每一次都会聚合两个类,那么如果有 n 个样本,那么最终会进行(n-1)次聚合,显然,Z 矩阵有 n-1 行,这就意味着每一行表示了一次操作。

    那么接下来,我们从上到下解读。

    首先, Z 矩阵表示一个树状图,对于每一行来说,其中第一个和第二个元素是每一步合并的两个簇,第三个元素是这些簇之间的距离,第四个元素是新簇的大小——包含的原始数据点的数量.

    第一步:
    根据 Z 的第一行,那么索引 2 和 7 将会合并为一个新的类,新的类给一个新的索引,譬如为 8,第三个数 0 表示索引 2和 7的两个簇之间的距离为 0,这是显然的。最后一个数 2 表示当前合并完的这个类有 2个元素。

    在这里插入图片描述
    同理,我们可以把这一系列过程都表达如下:

    在这里插入图片描述

    2. 常用参数的设置

    • linkage函数
    import scipy.cluster.hierarchy as hcluster
    Z = hcluster.linkage(X, method='centroid')
    
    • 1
    • 2
    1. 第一个参数y为一个尺寸为(m,n)的二维矩阵。一共有n个样本,每个样本有m个维度。
    2. 参数method =
      ’single’:一范数距离
      ’complete’:无穷范数距离
      ’average’:平均距离
      ’centroid’:二范数距离
      ’ward’:离差平方和距离
    3. 返回值:(n-1)*4 的矩阵 Z
    • fcluster函数
      ->从给定链接矩阵定义的层次聚类中形成平面聚类
    import scipy.cluster.hierarchy as hcluster
    f = fcluster(Z, t=3, criterion='distance')
    
    • 1
    • 2

    这个函数压平树状图

    这种分配主要取决于距离阈值 t——允许的最大簇间距离

    1. 参数 Z 是 linkage 函数的输出 Z。
    2. 参数 scalar:形成扁平簇的阈值。
    3. 参数 criterion :
      • ’inconsistent’:预设的,如果一个集群节点及其所有后代的不一致值小于或等于 t,那么它的所有叶子后代都属于同一个平面集群。当没有非单例集群满足此条件时,每个节点都被分配到自己的集群中。
      • ’distance’:每个簇的距离不超过 t。
      • criterion=‘maxclust’:当取这个参数时,t 表示最大分类簇数。
      • maxclust_monocrit :
      • monocrit :
      • inconsistent :
    4. 输出是每一个特征的类别。
    • dendrogram函数
      绘制层次聚类图
      在这里插入图片描述

    参考链接

    [1] 层次聚类python,scipy(dendrogram, linkage,fcluster函数)2021.6
    [2] Python scipy.cluster.hierarchy.fcluster用法及代码示例 2022.7
    [3] 层次聚类算法及通过python的scipy进行计算 2022.7

  • 相关阅读:
    类之间的关系
    JavaScript中事件绑定和DOM事件流(冒泡和捕获)-案例详解
    [c++刷题]贪心算法.N01
    二、Excel VBA 简单使用
    Python - python如何连接sql server数据库
    性能工具之 JMeter 常用组件介绍(八)
    pip安装报错 RuntimeError:Python version 2.7 or 3.4+ is required——解决办法
    计算机视觉与深度学习 | 惯性/视觉/激光雷达SLAM技术综述
    100天精通风控建模(原理+Python实现)——第7天:风控建模中归一化是什么?
    Java(103):列表转化成map;map和json互换
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/125987933