Python聚类算法之凝聚层次聚类实例分析

 更新时间:2015年11月20日 11:15:20   作者:intergret  
这篇文章主要介绍了Python聚类算法之凝聚层次聚类的原理与具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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中Genarator函数用法分析

    python中Genarator函数用法分析

    这篇文章主要介绍了python中Genarator函数用法,实例分析了Genarator函数的使用原理与相关技巧,需要的朋友可以参考下
    2015-04-04
  • Python+OpenCV目标跟踪实现基本的运动检测

    Python+OpenCV目标跟踪实现基本的运动检测

    这篇文章主要为大家详细介绍了Python+OpenCV目标跟踪实现基本的运动检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Django跨域请求无法传递Cookie的解决

    Django跨域请求无法传递Cookie的解决

    这篇文章主要介绍了Django跨域请求无法传递Cookie的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 简单的命令查看安装的python版本号

    简单的命令查看安装的python版本号

    在本篇内容里小编给大家整理的是关于简单的命令查看安装的python版本号的文章,需要的朋友们可以参考下。
    2020-08-08
  • PyTorch模型创建与nn.Module构建

    PyTorch模型创建与nn.Module构建

    这篇文章主要为大家介绍了PyTorch模型创建与nn.Module构建示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Python一行代码实现自动发邮件功能

    Python一行代码实现自动发邮件功能

    最近在自己学习Python爬虫,学到了用Python发送邮件,觉得这个可能以后比较实用。所以这篇文章主要给大家介绍了如何通过Python一行代码实现自动发邮件功能的相关资料,需要的朋友可以参考下
    2021-05-05
  • Python二维数组实现求出3*3矩阵对角线元素的和示例

    Python二维数组实现求出3*3矩阵对角线元素的和示例

    今天小编就为大家分享一篇Python二维数组实现求出3*3矩阵对角线元素的和示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python在不同场景合并多个Excel的方法

    Python在不同场景合并多个Excel的方法

    这篇文章主要介绍了Python在不同场景合并多个Excel的方法,文章围绕主题总共分享了三种方法,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Numpy 多维数据数组的实现

    Numpy 多维数据数组的实现

    这篇文章主要介绍了Numpy 多维数据数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Python使用HTTP POST上传WAV文件的方法

    Python使用HTTP POST上传WAV文件的方法

    Python是一个非常流行的编程语言,可以用于开发不同类型的应用程序。其中,上传文件是一个非常常见的需求。具体而言,我们探讨了使用HTTP POST请求上传单个和多个WAV文件的方法。无论你是需要将音频文件上传到云存储还是服务器,这些方法都能帮助你上传文件。
    2023-06-06

最新评论