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实现简单点对点(p2p)聊天
Sep 13 Python
使用python实现knn算法
Dec 20 Python
python的re正则表达式实例代码
Jan 24 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
详解python中groupby函数通俗易懂
May 14 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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
删除无限级目录与文件代码共享
2006/07/12 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
php对数组排序代码分享
2014/02/24 PHP
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
vue源码解析之事件机制原理
2018/04/21 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
融资合作协议书范本
2014/10/17 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
2015年推普周活动方案
2015/05/06 职场文书
民事起诉状范文
2015/05/19 职场文书
刑事辩护词范文
2015/05/21 职场文书
Python学习之时间包使用教程详解
2022/03/21 Python