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 strip()函数 介绍
May 24 Python
Python中3种内建数据结构:列表、元组和字典
Nov 30 Python
用Python中的wxPython实现最基本的浏览器功能
Apr 14 Python
python创建进程fork用法
Jun 04 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
详解Python 函数参数的拆解
Sep 02 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
python实现扫雷游戏的示例
Oct 20 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
再谈python_tkinter弹出对话框创建
Mar 20 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
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
php调整服务器时间的方法
2015/04/03 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
电子专业毕业生自荐信
2014/05/25 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
初二学生评语大全
2014/12/26 职场文书
介绍信样本
2015/01/31 职场文书
个人政治思想总结
2015/03/05 职场文书
nginx请求限制配置方法
2021/07/09 Servers