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切换hosts文件代码示例
Dec 31 Python
Python里隐藏的“禅”
Jun 16 Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
python 设置文件编码格式的实现方法
Dec 21 Python
python爬取各类文档方法归类汇总
Mar 22 Python
《与孩子一起学编程》python自测题
May 27 Python
python生成密码字典的方法
Jul 06 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
python3判断IP地址的方法
Mar 04 Python
Python中的datetime包与time包包和模块详情
Feb 28 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 URL编码解码函数代码
2009/03/10 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
python正则表达式中的括号匹配问题
2014/12/14 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
Django model序列化为json的方法示例
2018/10/16 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Python同时处理多个异常的方法
2020/07/28 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
门卫岗位安全职责
2013/12/13 职场文书
2014年司机工作总结
2014/11/21 职场文书
兵马俑的导游词
2015/02/02 职场文书