起步

层次聚类(hierarchical clustering)是聚类算法中的一种,通过计算不同类别的相似度组成新的类创建一个层次的嵌套的树。

基本结构如图所示:

层次聚类算法介绍

假设有n个待聚类的样本,对于层次聚类算法,它的步骤是:

  • 步骤一:(初始化)将每个样本都视为一个聚类;
  • 步骤二:计算各个聚类之间的相似度;
  • 步骤三:寻找最近的两个聚类,将他们归为一类;
  • 步骤四:重复步骤二,步骤三;直到所有样本归为一类

整个过程就是建立一棵树,在建立的过程中,可以在步骤四设置所需分类的类别个数,作为迭代的终止条件,毕竟都归为一类并不实际。

聚类之间的相似度

聚类和聚类之间的相识度有什么来衡量呢?既然是空间中的点,可以采用距离的方式来衡量,一般有如下三种方式:

Single Linkage

又叫做 nearest-neighbor ,就是取两个类中距离最近的两个样本的距离作为这两个集合的距离。这种计算方式容易造成一种叫做 Chaining 的效果,两个 cluster 明明从“大局”上离得比较远,但是由于其中个别的点距离比较近就被合并了,并且这样合并之后 Chaining 效应会进一步扩大,最后会得到比较松散的 cluster 。

Complete Linkage

这个则完全是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离。其效果也是刚好相反的,限制非常大。这两种相似度的定义方法的共同问题就是指考虑了某个有特点的数据,而没有考虑类内数据的整体特点。

Average Linkage 这种方法就是把两个集合中的点两两的距离全部放在一起求均值,相对也能得到合适一点的结果。有时异常点的存在会影响均值,平常人和富豪平均一下收入会被拉高是吧,因此这种计算方法的一个变种就是取两两距离的中位数。

Python的代码实现:

空间中点的距离使用欧拉公式:

import math
import numpy as np
from sklearn import datasets,clusterdef euler_distance(point1: np.ndarray, point2: list) -> float:"""计算两点之间的欧拉距离,支持多维"""distance = 0.0for a, b in zip(point1, point2):distance += math.pow(a - b, 2)return math.sqrt(distance)

定义聚类点的节点:

class ClusterNode(object):def __init__(self, vec, left=None, right=None, distance=-1, id=None, count=1):""":param vec: 保存两个数据聚类后形成新的中心:param left: 左节点:param right:  右节点:param distance: 两个节点的距离:param id: 用来标记哪些节点是计算过的:param count: 这个节点的叶子节点个数"""self.vec = vecself.left = leftself.right = rightself.distance = distanceself.id = idself.count = count

vec 表示合并后的聚类中心,是一个点,代表整个聚类的位置;distance 表示左节点和右节点的距离。

计算层次聚类算法的类:

class Hierarchical(object):def __init__(self, k = 1):assert k > 0self.k = kself.labels = Nonedef fit(self, x):nodes = [ClusterNode(vec=v, id=i) for i,v in enumerate(x)]distances = {}point_num, future_num = np.shape(x)  # 特征的维度self.labels = [ -1 ] * point_numcurrentclustid = -1while len(nodes) > self.k:min_dist = math.infnodes_len = len(nodes)closest_part = None  # 表示最相似的两个聚类for i in range(nodes_len - 1):for j in range(i + 1, nodes_len):# 为了不重复计算距离,保存在字典内d_key = (nodes[i].id, nodes[j].id)if d_key not in distances:distances[d_key] = euler_distance(nodes[i].vec, nodes[j].vec)d = distances[d_key]if d < min_dist:min_dist = dclosest_part = (i, j)# 合并两个聚类part1, part2 = closest_partnode1, node2 = nodes[part1], nodes[part2]new_vec = [ (node1.vec[i] * node1.count + node2.vec[i] * node2.count ) / (node1.count + node2.count)for i in range(future_num)]new_node = ClusterNode(vec=new_vec,left=node1,right=node2,distance=min_dist,id=currentclustid,count=node1.count + node2.count)currentclustid -= 1del nodes[part2], nodes[part1]   # 一定要先del索引较大的nodes.append(new_node)self.nodes = nodesself.calc_label()def calc_label(self):"""调取聚类的结果"""for i, node in enumerate(self.nodes):# 将节点的所有叶子节点都分类self.leaf_traversal(node, i)def leaf_traversal(self, node: ClusterNode, label):"""递归遍历叶子节点"""if node.left == None and node.right == None:self.labels[node.id] = labelif node.left:self.leaf_traversal(node.left, label)if node.right:self.leaf_traversal(node.right, label)

最后将聚类的列表标记保存于 labels 中。

测试:

与 sklearn 进行对比:

iris = datasets.load_iris()my = Hierarchical(4)
my.fit(iris.data)
print(np.array(my.labels))sk = cluster.AgglomerativeClustering(4)
sk.fit(iris.data)
print(sk.labels_)

得到输出:

层次聚类的优缺点:

优点:

  • 一次性得到聚类树,后期再分类无需重新计算;
  • 相似度规则容易定义;
  • 可以发现类别的层次关系。

缺点:

  • 计算复杂度高,不适合数据量大的;
  • 算法很可能形成链状。

12.聚类算法之层次聚类相关推荐

  1. 聚类算法之层次聚类算法和应用举例

    聚类算法之层次聚类算法和应用举例 1.假设有N个待聚类的样本,对于层次聚类来说,步骤: 1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度: 2.寻找各个类之间最近 ...

  2. 【聚类算法】层次聚类算法

    目录 定义 样例 算法 Single Linkage Complete Linkage Average Linkage Centroid Linkage Ward 总结 定义 这个算法可以分为两部分理 ...

  3. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解

    注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...

  4. 聚类算法之层次聚类方法

    目录 AGNES算法 DIANA算法 类间距离的不同定义 层次聚类算法的优缺点 层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止.具体又可分为:凝聚的层次聚类AGNES算法和分裂的层次聚 ...

  5. 聚类算法:凝聚层次聚类

    凝聚层次聚类: 所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇.另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并.对于这里的"最接近&qu ...

  6. 层次聚类python实现_聚类算法之层次聚类(Python实现)

    起步 层次聚类( Hierarchical Clustering )是聚类算法的一种,通过计算不同类别的相似度类创建一个有层次的嵌套的树. 层次聚类算法介绍 假设有 n 个待聚类的样本,对于层次聚类算 ...

  7. 【机器学习】聚类算法:层次聚类、K-means聚类

    聚类算法实践(一)--层次聚类.K-means聚类 摘要: 所谓聚类,就是将相似的事物聚集在一 起,而将不相似的事物划分到不同的类别的过程,是数据分析之中十分重要的一种手段.比如古典生物学之中,人们通 ...

  8. 【一起入门MachineLearning】中科院机器学习第*课-聚类算法:层次聚类

    专栏介绍:本栏目为 "2021秋季中国科学院大学周晓飞老师的机器学习" 课程记录,不仅仅是课程笔记噢- 如果感兴趣的话,就和我一起入门Machine Learning吧

  9. 模式识别:C-means(K-means)聚类算法与分级聚类(层次聚类)算法

    C均值聚类算法与分级聚类算法的聚类分析 一.实验目的 理解聚类的整体思想,了解聚类的一般方法: 掌握 C-means与分级聚类算法算法思想及原理,并能够熟练运用这些算法进行聚类分析: 能够分析二者的优 ...

最新文章

  1. 《Go并发编程实战》第2版 紧跟Go的1.8版本
  2. ×××与字符串的相互转换
  3. son-server模拟http mock数据
  4. QPSK调制与解调(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释)
  5. web打印网页指定区域
  6. 小程序加入人脸识别_微信小程序实现人脸识别
  7. Auto Layout 使用心得—— 实现三等分
  8. python学习----登陆
  9. Java 集合类入门篇
  10. 【果壳笔记】生物信息学——王秀杰老师部分
  11. 学习TypeScript
  12. mysql优化-Explain工具介绍
  13. Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
  14. linux版本的多屏协同,一招搞定手机和电脑的多屏协同
  15. 拉姆达表达式学习(2)
  16. JavaApplet运行
  17. 四六级重要单词(二)
  18. 查询sick编码器型号是否支持hiperface接口方法,软件支持所有带此接口sick编码器
  19. 图像处理(6)--图像深度
  20. TR200 ASSSD跑分测试

热门文章

  1. 【源码】直流电机速度控制的Simscape模型
  2. Atcoder Regular Contest 92 D Two Sequences F Two Faced Edges 两道神题
  3. 搜狗旅行翻译宝获阿联酋驻华大使青睐 助力中外友好交流
  4. 对话搜狗口语机器翻译团队:国际冠军的诞生
  5. 联易融成为BSN合格开发者,供应链金融平台入选官方指定应用
  6. 常见防火墙设置图文说明
  7. C++抽象类纸上谈兵
  8. 四十三.调试会员等级接口
  9. 【Matlab】Logistic回归(Excel可直接替换数据)
  10. 用SQL命令修改数据库