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

作者:intergret 时间:2023-08-01 05:30:14 

本文实例讲述了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,算法
0
投稿

猜你喜欢

  • 两种oracle创建字段自增长的实现方式

    2024-01-15 09:47:44
  • MySQL select count(*)计数很慢优化方案

    2024-01-23 21:31:24
  • Node.js多进程的方法与参数实例说明

    2024-05-02 17:37:37
  • Python异步之迭代器如何使用详解

    2023-09-10 17:48:34
  • python实现同时给多个变量赋值的方法

    2021-10-09 07:02:50
  • python 生成正态分布数据,并绘图和解析

    2022-02-11 07:14:00
  • 使用php将某个目录下面的所有文件罗列出来的方法详解

    2023-09-29 10:47:05
  • Python基于opencv的图像压缩算法实例分析

    2022-09-29 11:20:41
  • python简单实现基于SSL的IRC bot实例

    2022-05-29 21:18:03
  • Requests什么的通通爬不了的Python超强反爬虫方案!

    2022-02-13 18:43:45
  • 分享2个方便调试Python代码的实用工具

    2021-08-26 18:50:08
  • Python中scatter散点图及颜色整理大全

    2022-10-06 02:17:51
  • Vue3 ref构建响应式变量失效问题及解决

    2023-07-02 16:33:49
  • pytorch 利用lstm做mnist手写数字识别分类的实例

    2023-01-31 03:15:38
  • asp如何在约定时间显示特定的提示信息?

    2010-06-28 16:52:00
  • perl AnyEvent简单介绍和入门知识

    2022-09-22 03:10:50
  • Javascript 字符串模板的简单实现

    2024-05-02 17:30:37
  • SQL Server数据库连接中常见的错误分析

    2009-01-15 12:51:00
  • Python实例练习水仙花数问题讲解

    2023-05-26 18:38:11
  • 分享Win10 1903过TP的双机调试问题

    2023-03-09 19:02:37
  • asp之家 网络编程 m.aspxhome.com