首页 > 编程 > Python > 正文

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

2020-01-04 17:56:09
字体:
来源:转载
供稿:网友
这篇文章主要介绍了Python聚类算法之凝聚层次聚类的原理与具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
 

本文实例讲述了Python聚类算法之凝聚层次聚类。分享给大家供大家参考,具体如下:

凝聚层次聚类:所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇。另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并。对于这里的“最接近”,有下面三种定义。我在实现是使用了MIN,该方法在合并时,只要依次取当前最近的点对,如果这个点对当前不在一个簇中,将所在的两个簇合并就行:

单链(MIN):定义簇的邻近度为不同两个簇的两个最近的点之间的距离。
全链(MAX):定义簇的邻近度为不同两个簇的两个最远的点之间的距离。
组平均:定义簇的邻近度为取自两个不同簇的所有点对邻近度的平均值。
 

  1. # scoding=utf-8 
  2. # Agglomerative Hierarchical Clustering(AHC) 
  3. import pylab as pl 
  4. from operator import itemgetter 
  5. from collections import OrderedDict,Counter 
  6. points = [[int(eachpoint.split('#')[0]), int(eachpoint.split('#')[1])] for eachpoint in open("points","r")] 
  7. # 初始时每个点指派为单独一簇 
  8. groups = [idx for idx in range(len(points))] 
  9. # 计算每个点对之间的距离 
  10. disP2P = {} 
  11. for idx1,point1 in enumerate(points): 
  12.   for idx2,point2 in enumerate(points): 
  13.     if (idx1 < idx2): 
  14.       distance = pow(abs(point1[0]-point2[0]),2) + pow(abs(point1[1]-point2[1]),2) 
  15.       disP2P[str(idx1)+"#"+str(idx2)] = distance 
  16. # 按距离降序将各个点对排序 
  17. disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True)) 
  18. # 当前有的簇个数 
  19. groupNum = len(groups) 
  20. # 过分合并会带入噪音点的影响,当簇数减为finalGroupNum时,停止合并 
  21. finalGroupNum = int(groupNum*0.1) 
  22. while groupNum > finalGroupNum: 
  23.   # 选取下一个距离最近的点对 
  24.   twopoins,distance = disP2P.popitem() 
  25.   pointA = int(twopoins.split('#')[0]) 
  26.   pointB = int(twopoins.split('#')[1]) 
  27.   pointAGroup = groups[pointA] 
  28.   pointBGroup = groups[pointB] 
  29.   # 当前距离最近两点若不在同一簇中,将点B所在的簇中的所有点合并到点A所在的簇中,此时当前簇数减1 
  30.   if(pointAGroup != pointBGroup): 
  31.     for idx in range(len(groups)): 
  32.       if groups[idx] == pointBGroup: 
  33.         groups[idx] = pointAGroup 
  34.     groupNum -= 1 
  35. # 选取规模最大的3个簇,其他簇归为噪音点 
  36. wantGroupNum = 3 
  37. finalGroup = Counter(groups).most_common(wantGroupNum) 
  38. finalGroup = [onecount[0] for onecount in finalGroup] 
  39. dropPoints = [points[idx] for idx in range(len(points)) if groups[idx] not in finalGroup] 
  40. # 打印规模最大的3个簇中的点 
  41. group1 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[0]] 
  42. group2 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[1]] 
  43. group3 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[2]] 
  44. pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or'
  45. pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy'
  46. pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')   
  47. # 打印噪音点,黑色 
  48. pl.plot([eachpoint[0] for eachpoint in dropPoints], [eachpoint[1] for eachpoint in dropPoints], 'ok')   
  49. pl.show() 
?

运行效果截图如下:

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

希望本文所述对大家Python程序设计有所帮助。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表