层次聚类(Hierarchical Clustering)

一.概念

层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类由两个子类构成,每个子类又由更小的两个子类构成。如下图所示:

二.合并方法

在聚类中每次迭代都将两个最近的类进行合并,这个类间的距离计算方法常用的有三种:

1.单连接聚类(Single-linkage clustering)

在单连接聚类中,两个类间的距离定义为一个类的所有实例到另一个类的所有实例之间最短的那个距离。如上图中类A(A1,A2),B(B1,B2),C(C1,C2),A类和B类间的最短距离是A1到B1,所以A类与B类更近,所有A和B合并。

2.全连接聚类(Complete-linkage clustering)

在全连接聚类中,两个类间的距离定义为一个类的所有实例到另一个类的所有实例之间最长的那个距离。图中A类和B类间最长距离是A2到B2,B类和C类最长距离是B1到C1,distance(B1-C1)

3.平均连接聚类(Average-linkage clustering)

在平均连接聚类中,类间的距离为一个类的所有实例到另一个类的所有实例的平均距离。

三.python实现(单连接)

1 #!/usr/bin/python

2 #-*- coding: utf-8 -*-

3

4 from queue importPriorityQueue5 importmath6 importcodecs7

8

9 """

10 层次聚类11 """

12 classHCluster:13

14 #一列的中位数

15 defgetMedian(self,alist):16 tmp =list(alist)17 tmp.sort()18 alen =len(tmp)19 if alen % 2 == 1:20 return tmp[alen // 2]21 else:22 return (tmp[alen // 2] + tmp[(alen // 2) - 1]) / 2

23

24 #对数值型数据进行归一化,使用绝对标准分[绝对标准差->asd=sum(x-u)/len(x),x的标准分->(x-u)/绝对标准差,u是中位数]

25 defnormalize(self,column):26 median =self.getMedian(column)27 asd = sum([abs(x - median) for x in column]) /len(column)28 result = [(x - median) / asd for x incolumn]29 returnresult30

31 def __init__(self,filepath):32 self.data={}33 self.counter=034 self.queue=PriorityQueue()35 line_1=True#开头第一行

36 with codecs.open(filepath,'r','utf-8') as f:37 for line inf:38 #第一行为描述信息

39 ifline_1:40 line_1=False41 header=line.split(',')42 self.cols=len(header)43 self.data=[[] for i inrange(self.cols)]44 else:45 instances=line.split(',')46 toggle=047 for instance inrange(self.cols):48 if toggle==0:49 self.data[instance].append(instances[instance])50 toggle=1

51 else:52 self.data[instance].append(float(instances[instance]))53 #归一化数值列

54 for i in range(1,self.cols):55 self.data[i]=self.normalize(self.data[i])56

57 #欧氏距离计算元素i到所有其它元素的距离,放到邻居字典中,比如i=1,j=2...,结构如i=1的邻居-》{2: ((1,2), 1.23), 3: ((1, 3), 2.3)... }

58 #找到最近邻

59 #基于最近邻将元素放到优先队列中

60 #data[0]放的是label标签,data[1]和data[2]是数值型属性

61 rows=len(self.data[0])62 for i inrange(rows):63 minDistance=10000

64 nearestNeighbor=065 neighbors={}66 for j inrange(rows):67 if i!=j:68 dist=self.distance(i,j)69 if i<70 pair="(i,j)71" else:72 neighbors if dist mindistance="dist76" nearestneighbor="j77">

78 if i<79 nearestpair="(i,nearestNeighbor)80" else:81>

83 self.queue.put((minDistance,self.counter,[[self.data[0][i]],nearestPair,neighbors]))84 self.counter+=1

85

86 #欧氏距离,d(x,y)=math.sqrt(sum((x-y)*(x-y)))

87 defdistance(self,i,j):88 sumSquares=089 for k in range(1,self.cols):90 sumSquares+=(self.data[k][i]-self.data[k][j])**2

91 returnmath.sqrt(sumSquares)92

93 #聚类

94 defcluster(self):95 done=False96 while notdone:97 topOne=self.queue.get()98 nearestPair=topOne[2][1]99 if notself.queue.empty():100 nextOne=self.queue.get()101 nearPair=nextOne[2][1]102 tmp=[]103 #nextOne是否是topOne的最近邻,如不是继续找

104 while nearPair!=nearestPair:105 tmp.append((nextOne[0],self.counter,nextOne[2]))106 self.counter+=1

107 nextOne=self.queue.get()108 nearPair=nextOne[2][1]109 #重新加回Pop出的不相等最近邻的元素

110 for item intmp:111 self.queue.put(item)112

113 if len(topOne[2][0])==1:114 item1=topOne[2][0][0]115 else:116 item1=topOne[2][0]117 if len(nextOne[2][0])==1:118 item2=nextOne[2][0][0]119 else:120 item2=nextOne[2][0]121 #联合两个最近邻族成一个新族

122 curCluster=(item1,item2)123 #下面使用单连接方法建立新族中的邻居距离元素,一:计算上面新族的最近邻。二:建立新的邻居。如果 item1和item3距离是2,item2和item3距离是4,则在新族中的距离是2

124 minDistance=10000

125 nearestPair=()126 nearestNeighbor=''

127 merged={}128 nNeighbors=nextOne[2][2]129 for key,value in topOne[2][2].items():130 if key innNeighbors:131 if nNeighbors[key][1]

145

146 if __name__=='__main__':147 hcluser=HCluster('filePath')148 cluser=hcluser.cluster()149 print(cluser)

参考:1.machine.learning.an.algorithmic.perspective.2nd.edition.

2.a programmer's guide to data mining

79>70>

java层次聚类_python实现一个层次聚类方法相关推荐

  1. python杀死线程的方法_python杀死一个线程的方法

    由于python线程没有提供abort方法,所以我们需要自己想办法解决此问题,面对这一问题,小编帮大家解决phthon杀死一个线程的方法 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一 ...

  2. python如何输入集合_python输入一个集合的方法

    python输入一个集合的方法 发布时间:2020-09-22 13:54:58 来源:亿速云 阅读:87 作者:小新 这篇文章主要介绍了python输入一个集合的方法,具有一定借鉴价值,需要的朋友可 ...

  3. python 定义函数方法_Python定义一个函数的方法

    Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具.定义函数需要用 def 关键字实现,具体的语法格式如下: def 函数名(形参列表): //由零条到多条可执 ...

  4. python层次聚类_python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法 | 学步园...

    python机器学习包里面的cluster提供了很多聚类 但是没有看明白ward_tree的返回值代表了什么含义,遂决定寻找别的实现方式. 经过查找,发现scipy.cluster.hierarchy ...

  5. python kmeans聚类_python机器学习之k-means聚类算法(1)

    k-means算法是一种无监督的机器学习算法,虽然是机器学习,但它简单易于实现.本篇采用python语言,自主编程实现k-menas算法,当然python用专门的库函数来实现该算法,但本次主要使用该算 ...

  6. python怎么定义一个函数_Python定义一个函数的方法

    Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具.定义函数需要用 def 关键字实现,具体的语法格式如下: def 函数名(形参列表): //由零条到多条可执 ...

  7. java 释放一个对象_JAVA中销毁一个对象的方法

    方法一:垃圾回收器 垃圾回收器是Java平台中用的最频繁的一种对象销毁方法.垃圾回收器会全程侦测Java应用程序的运行情况.当反先有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的 ...

  8. java 调用多次_关于java:Mockito可以捕获多次调用方法的参数吗?

    我有一个方法被调用两次,我想捕获第二个方法调用的参数. 以下是我的尝试: ArgumentCaptor firstFooCaptor = ArgumentCaptor.forClass(Foo.cla ...

  9. python层次聚类_python实现层次聚类

    BAFIMINARMTO BA0662877255412996 FI6620295468268400 MI8772950754564138 NA2554687540219869 RM412268564 ...

最新文章

  1. 单调队列多重背包时间复杂度O(vn)
  2. beego1---beego,bee环境配置
  3. java转net容易吗_每日一醒(1):学习Java容易忽视的小错误,你注意到了吗?
  4. Python解析access数据库(mdb文件或者accdb文件)
  5. vep文件如何转换mp4_vep文件如何转换mp4?vep转mp4的操作演示简单又小白
  6. Spotfire 聚合筛选 会污损行数据
  7. mysql卸载报错2503_Win10系统卸载Skype软件报错2503的解决方法
  8. nginx流媒体服务器性能,搭建nginx流媒体服务器(支持HLS)
  9. 手机断触怎么办_手机触摸屏失灵了怎么办,五种方法自己就能修好它!
  10. python打印购物小票
  11. php openssl函数手册,OpenSSL 函数 - PHP 7 中文文档
  12. 数据库备份 bak 下载方式,迅雷
  13. 2个小巧好用的文本编辑器--Cuda Text(及中文设置方法)与Nopad--
  14. 怎么给图片加上红圈,红框,红箭头标重点等?还有添加文字
  15. 阿里巴巴的卫哲现在在做的事
  16. 未明学院学员报告:「看电影攻略」之豆瓣电影票房与口碑分析,这几类电影不易踩雷!
  17. [附源码]Python计算机毕业设计SSM基于的宠物领养管理系统(程序+LW)
  18. vlookup函数功能非常强大,那在Python中如何实现?
  19. vue样式中背景图片路径_解决vue打包css文件中背景图片的路径问题
  20. 软件测试 -- 进阶 6 软件缺陷

热门文章

  1. Symbian 介绍
  2. [python] 基于diagrams库绘制系统架构图
  3. PMO推进制造业数字化转型︱蓝云软件总裁唐智勇
  4. docker compose安装elasticsearch
  5. 图说蚁群算法(ACO)附源码
  6. 安装指定版本的docker服务
  7. c语言的free函数与内存空间释放
  8. 前置器330180-90-00本特利
  9. unity实现小球poke不穿膜
  10. java前端的日期插件_几个前端时间插件总结