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中的一些类型转换函数小结
Feb 10 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
python分布式环境下的限流器的示例
Oct 26 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
Python简单实现控制电脑的方法
Jan 22 Python
用python实现百度翻译的示例代码
Mar 09 Python
Django 跨域请求处理的示例代码
May 02 Python
python生成九宫格图片
Nov 19 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Python Merge函数原理及用法解析
Sep 16 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设计模式 Template (模板模式)
2011/06/26 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python六大开源框架对比
2015/10/19 Python
Python队列的定义与使用方法示例
2017/06/24 Python
5款非常棒的Python工具
2018/01/05 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
《陈涉世家》教学反思
2014/04/12 职场文书
会计毕业生自荐书
2014/06/12 职场文书
安全施工责任书
2014/08/25 职场文书
python可视化之颜色映射详解
2021/09/15 Python
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
Python 视频画质增强
2022/04/28 Python
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL