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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python实现大文件排序的方法
Jul 10 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python交换两个变量的值方法
Jan 12 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
python实现控制COM口的示例
Jul 03 Python
Python中的类与类型示例详解
Jul 10 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
Python socket 套接字实现通信详解
Aug 27 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
python运行脚本文件的三种方法实例
Jun 25 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
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
webpack配置之后端渲染详解
2017/10/26 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
vue插件实现v-model功能
2018/09/10 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python读写docx文件的方法
2018/05/08 Python
Python日志模块logging基本用法分析
2018/08/23 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
Python3简单实现串口通信的方法
2019/06/12 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
基于python的列表list和集合set操作
2019/11/24 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
详解Python IO口多路复用
2020/06/17 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
linux面试相关问题
2012/08/11 面试题
学校感恩教育活动总结
2014/07/07 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书