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根据出生日期获得年龄的方法
Mar 31 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python批量复制图片到另一个文件夹
Sep 17 Python
详解python算法之冒泡排序
Mar 05 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python模块future用法原理详解
Jan 20 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
django中cookiecutter的使用教程
Dec 03 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python使用Matplotlib画条形图
2020/03/25 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
学生个人自我鉴定
2014/03/26 职场文书
保护野生动物倡议书
2014/05/16 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
无罪辩护词范文
2015/05/21 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers