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通过函数属性实现全局变量的方法
May 16 Python
python3序列化与反序列化用法实例
May 26 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
基于python+selenium的二次封装的实现
Jan 06 Python
sklearn+python:线性回归案例
Feb 24 Python
python绘图pyecharts+pandas的使用详解
Dec 13 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
Python基础之pandas数据合并
Apr 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
德生PL550的电路分析
2021/03/02 无线电
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
深入理解vue中的$set
2017/06/01 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python 如何访问外围作用域中的变量
2016/09/11 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
python实现媒体播放器功能
2018/02/11 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
Python包和模块的分发详细介绍
2020/06/19 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
电大自我鉴定范文
2013/10/01 职场文书
社区学习十八大感想
2014/01/22 职场文书
婚宴邀请函
2015/01/30 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js