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程序中进行文件读取和写入操作的教程
Apr 28 Python
Python类定义和类继承详解
May 08 Python
python正则实现提取电话功能
Feb 24 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
详解python中list的使用
Mar 15 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
10款最好的Python开发编辑器
Jul 03 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
python代码如何注释
Jun 01 Python
Python 数据可视化神器Pyecharts绘制图像练习
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、Java des加密解密实例
2015/04/27 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
javascript折半查找详解
2015/01/26 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
仓库门卫岗位职责
2013/12/22 职场文书
大学毕业感言50字
2014/02/07 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
产品推广策划方案
2014/05/10 职场文书
团队激励口号
2014/06/06 职场文书
法定代表人免职证明
2015/06/24 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android