Python聚类算法之凝聚层次聚类实例分析


Posted in Python onNovember 20, 2015

本文实例讲述了Python聚类算法之凝聚层次聚类。分享给大家供大家参考,具体如下:

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

单链(MIN):定义簇的邻近度为不同两个簇的两个最近的点之间的距离。
全链(MAX):定义簇的邻近度为不同两个簇的两个最远的点之间的距离。
组平均:定义簇的邻近度为取自两个不同簇的所有点对邻近度的平均值。

# scoding=utf-8
# Agglomerative Hierarchical Clustering(AHC)
import pylab as pl
from operator import itemgetter
from collections import OrderedDict,Counter
points = [[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所在的簇中,此时当前簇数减1
  if(pointAGroup != pointBGroup):
    for idx in range(len(groups)):
      if groups[idx] == pointBGroup:
        groups[idx] = pointAGroup
    groupNum -= 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()

运行效果截图如下:

Python聚类算法之凝聚层次聚类实例分析

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python登陆asp网站页面的实现代码
Jan 14 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
python实现感知器算法(批处理)
Jan 18 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
Python聚类算法之基本K均值实例详解
Nov 20 #Python
Python实现将xml导入至excel
Nov 20 #Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 #Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 #Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 #Python
Python的Flask开发框架简单上手笔记
Nov 16 #Python
python实现mysql的单引号字符串过滤方法
Nov 14 #Python
You might like
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
python监控文件并且发送告警邮件
2018/06/21 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
浅析python的Lambda表达式
2019/02/27 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
python django中8000端口被占用的解决
2019/12/17 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
电话销售经理岗位职责
2013/12/07 职场文书
护士实习鉴定范文
2013/12/22 职场文书
公司担保书范文
2014/05/21 职场文书
商场促销活动总结
2014/07/10 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
党员进社区活动总结
2015/05/07 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python