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 k-近邻算法实例分享
Jun 11 Python
Python实现的批量下载RFC文档
Mar 10 Python
Java及python正则表达式详解
Dec 27 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
Django Rest framework权限的详细用法
Jul 25 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
python文件目录操作之os模块
May 08 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
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
nodejs基础知识
2017/02/03 NodeJs
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
浅谈js中的bind
2019/03/18 Javascript
python 整数越界问题详解
2019/06/27 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
基于python调用psutil模块过程解析
2019/12/20 Python
Python中包的用法及安装
2020/02/11 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python Map 函数的使用
2020/08/28 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
python爬取微博评论的实例讲解
2021/01/15 Python
phpquery中文手册
2021/03/18 PHP
毕业生动漫设计求职信
2013/10/11 职场文书
汇源肾宝广告词
2014/03/20 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
学期个人自我总结
2015/02/13 职场文书
门店店长岗位职责
2015/04/14 职场文书
病危通知书样本
2015/04/17 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
vue递归实现树形组件
2022/07/15 Vue.js