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中使用dom模块生成XML文件示例
Apr 05 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python解决八皇后问题示例
Apr 22 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
Python Collatz序列实现过程解析
Oct 12 Python
python wxpython 实现界面跳转功能
Dec 17 Python
python入门之基础语法学习笔记
Feb 08 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
PyTorch dropout设置训练和测试模式的实现
May 27 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php随机输出名人名言的代码
2012/10/07 PHP
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
详解javascript中的babel到底是什么
2018/06/21 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
详解JS函数防抖
2020/06/05 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
python mock测试的示例
2020/10/19 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
婚礼主持词开场白
2014/03/13 职场文书
销售活动策划方案
2014/08/26 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
创先争优个人总结
2015/03/04 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书