凝聚层次聚类

所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇。另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并。对于这里的“最接近”,有下面三种定义。我在实现是使用了MIN,该方法在合并时,只要依次取当前最近的点对,如果这个点对当前不在一个簇中,将所在的两个簇合并就行:

(1)单链(MIN):定义簇的邻近度为不同两个簇的两个最近的点之间的距离。

(2)全链(MAX):定义簇的邻近度为不同两个簇的两个最远的点之间的距离。

(3)组平均:定义簇的邻近度为取自两个不同簇的所有点对邻近度的平均值。

根据该算法,实现如下代码。开始时计算每个点对的距离,并按距离降序依次合并。另外为了防止过度合并,定义的退出条件是90%的簇被合并,即当前簇数是初始簇数的10%:

实现代码如下:

# scoding=utf-8
# Agglomerative Hierarchical Clustering(AHC)
import pylab as pl
from operator import itemgetter
from collections import OrderedDict,Counterpoints = [[int(eachpoint.split('#')[0]), int(eachpoint.split('#')[1])] for eachpoint in open("points","r")]# 初始时每个点指派为单独一簇
groups = [idx for idx in range(len(points))]# 计算每个点对之间的距离
disP2P = {}
for idx1,point1 in enumerate(points):for idx2,point2 in enumerate(points):if (idx1 < idx2):distance = pow(abs(point1[0]-point2[0]),2) + pow(abs(point1[1]-point2[1]),2)disP2P[str(idx1)+"#"+str(idx2)] = distance# 按距离降序将各个点对排序
disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True))# 当前有的簇个数
groupNum = len(groups)# 过分合并会带入噪音点的影响,当簇数减为finalGroupNum时,停止合并
finalGroupNum = int(groupNum*0.1)while groupNum > finalGroupNum:# 选取下一个距离最近的点对twopoins,distance = disP2P.popitem()pointA = int(twopoins.split('#')[0])pointB = int(twopoins.split('#')[1])pointAGroup = groups[pointA]pointBGroup = groups[pointB]# 当前距离最近两点若不在同一簇中,将点B所在的簇中的所有点合并到点A所在的簇中,此时当前簇数减1if(pointAGroup != pointBGroup):for idx in range(len(groups)):if groups[idx] == pointBGroup:groups[idx] = pointAGroupgroupNum -= 1# 选取规模最大的3个簇,其他簇归为噪音点
wantGroupNum = 3
finalGroup = Counter(groups).most_common(wantGroupNum)
finalGroup = [onecount[0] for onecount in finalGroup]dropPoints = [points[idx] for idx in range(len(points)) if groups[idx] not in finalGroup]# 打印规模最大的3个簇中的点
group1 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[0]]
group2 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[1]]
group3 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[2]]
pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or')
pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy')
pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')   # 打印噪音点,黑色
pl.plot([eachpoint[0] for eachpoint in dropPoints], [eachpoint[1] for eachpoint in dropPoints], 'ok')   pl.show()

另外我们可以看出凝聚的层次聚类并没有类似基本K均值的全局目标函数,没有局部极小问题或是很难选择初始点的问题。合并的操作往往是最终的,一旦合并两个簇之后就不会撤销。当然其计算存储的代价是昂贵的。

聚类算法:凝聚层次聚类相关推荐

  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. 12.聚类算法之层次聚类

    起步 层次聚类(hierarchical clustering)是聚类算法中的一种,通过计算不同类别的相似度组成新的类创建一个层次的嵌套的树. 基本结构如图所示: 层次聚类算法介绍 假设有n个待聚类的 ...

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

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

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

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

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

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

  9. python 凝聚层次聚类_关于层次聚类算法的python实现

    from scipy.cluster import hierarchy 0.层次聚类的概念 层次聚类和k-means一样都是很常用的聚类方法.层次聚类是对群体的划分,最终将样本划分为树状的结构.他的基 ...

最新文章

  1. (转)Android笔记--handler机制
  2. 「完结」总结12大CNN主流模型架构设计思想
  3. numba 让python速度提升百倍
  4. 影响中国发展的七大垂直搜索引擎
  5. js实现倒计时 类似团购网站
  6. python多进程间通信_python多进程间通信代码实例
  7. 《python透明人士,他是凭什么成为主流编程的宠儿?!》python基础语法
  8. 意见簿---在批评中成长
  9. ARCH-LINUX 折(安)腾(装)记
  10. 函数指针 回调函数 面向对象风格的C语言
  11. 魔方机器人之下位机编程----串口接收数据并解析
  12. 使用JS动态生成表格
  13. 面试常见的逻辑推理题
  14. 一键steam挂卡linux,steam游戏挂卡工具(ArchiSteamFarm)
  15. 073_SFDC Limit
  16. 应用程序和操作系统的关系是什么
  17. 4.1.2. Constants
  18. vivo手机里的log是什么意思?
  19. 安卓很抱歉已停止运行
  20. apscheduler调度器异常错误:skipped: maximum number of running instances reached (1)

热门文章

  1. 华为发布金融数据智能解决方案,金融数智化有了新“良方”
  2. 关于电压环误差放大器的认识
  3. 一分钟教会你PPT翻译器怎么用
  4. 三星半导体和三星显示在中国启动运营官方新媒体账号
  5. 风格迁移--生成你想要的风格
  6. php微积分难吗,对微积分的忌惮让女人们不敢搞科研
  7. Anaconda + Pycharm + Pytorch 一套太极组合拳安装教程
  8. 天涯明月刀手游服务器维修,《天涯明月刀》12月30日服务器例行维护介绍
  9. [济南考勤机专题]考勤机类型(六)生物识别考勤机
  10. Andorid Jetpack Hilt