zoukankan      html  css  js  c++  java
  • 【python】利用scipy进行层次聚类

    参考博客:

    https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/

    层次聚类理论知识

    类从多减少的过程。
    1、定义样本间的距离,类与类之间的距离
    2、将每个样本当作一类,计算距离最近的两类,合并为新类
    3、一点一点做,直到所有成为一类。
     
    基本步骤:
    1、数据变换:
         中心化:demean
         标准化:deStd
         极差标准化:deMean / 极差
         极差正规化:de min / 极差
         对数变换
    2、计算样品两两间距离
    3、合并距离最小的两类,重新计算类与类之间的距离
    4、画谱系聚类图
    5、决定分类的个数以及各个类的成员。
     
    类与类之间的距离不同定义:
    1、最短距离法:两两之间最短距离
    2、最长距离法
    3、中间距离法
    4、重心法:可能导致合并后下一次距离比前一次要短
    5、类平均法:两两之间平方距离的平均值
    6、离差平方和法:WARD
     
    性质:
    1、单调性:只有中间距离法和重心法不符合。
    2、浓缩与扩张:太浓缩的方法不灵敏,太扩张的方法在样本比较多的时候容易失真
     
    类个数的确定:
    1、给定临界值、
    2、根据散点图判断
    3、根据统计量判断:
         R2、半偏R2、伪F、伪T

    来看代码:

    from scipy.cluster.hierarchy import dendrogram, linkage
    Z = linkage(X, "single", "correlation")
    dendrogram(Z, labels=X.index, color_threshold=0)
    plt.show()

    首先使用linkage函数生成距离矩阵。

    method参数为距离定义:

      single : 最短距离法

      complete: 最长距离法

      average: 类平均法, 与通常定义差一个sq, sqrt

      centroid: 重心法

      weighted: 中间距离法

      ward: WARD法

    使用fcluster函数确定最终的分组情况:

  • 相关阅读:
    将n个不同的球放到m个相同的袋子里有多少种方案?

    平面分割直线2
    差分
    并查集(UnionFind)
    约瑟夫环公式
    Kruskal
    线性欧拉筛
    SPAF
    Dijkstra
  • 原文地址:https://www.cnblogs.com/yesuuu/p/9518069.html
Copyright © 2011-2022 走看看