聚类(2)——层次聚类 Hierarchical Clustering

原创 2012年06月23日 11:09:39

聚类系列:

--------------------------------

 

不管是GMM,还是k-means,都面临一个问题,就是k的个数如何选取?比如在bag-of-words模型中,用k-means训练码书,那么应该选取多少个码字呢?为了不在这个参数的选取上花费太多时间,可以考虑层次聚类。


假设有N个待聚类的样本,对于层次聚类来说,基本步骤就是:

       1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度;

       2、寻找各个类之间最近的两个类,把他们归为一类(这样类的总数就少了一个);

       3、重新计算新生成的这个类与各个旧类之间的相似度;

       4、重复2和3直到所有样本点都归为一类,结束。

 

整个聚类过程其实是建立了一棵树,在建立的过程中,可以通过在第二步上设置一个阈值,当最近的两个类的距离大于这个阈值,则认为迭代可以终止。另外关键的一步就是第三步,如何判断两个类之间的相似度有不少种方法。这里介绍一下三种:

        SingleLinkage:又叫做 nearest-neighbor ,就是取两个类中距离最近的两个样本的距离作为这两个集合的距离,也就是说,最近两个样本之间的距离越小,这两个类之间的相似度就越大。容易造成一种叫做 Chaining 的效果,两个 cluster 明明从“大局”上离得比较远,但是由于其中个别的点距离比较近就被合并了,并且这样合并之后 Chaining 效应会进一步扩大,最后会得到比较松散的 cluster 。

       CompleteLinkage:这个则完全是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离。其效果也是刚好相反的,限制非常大,两个 cluster 即使已经很接近了,但是只要有不配合的点存在,就顽固到底,老死不相合并,也是不太好的办法。这两种相似度的定义方法的共同问题就是指考虑了某个有特点的数据,而没有考虑类内数据的整体特点。

       Average-linkage:这种方法就是把两个集合中的点两两的距离全部放在一起求一个平均值,相对也能得到合适一点的结果。

       average-linkage的一个变种就是取两两距离的中值,与取均值相比更加能够解除个别偏离样本对结果的干扰。


这种聚类的方法叫做agglomerative hierarchical clustering(自下而上,@2013.11.20 之前把它写成自顶而下了,我又误人子弟了。感谢4楼的网友指正)的,描述起来比较简单,但是计算复杂度比较高,为了寻找距离最近/远和均值,都需要对所有的距离计算个遍,需要用到双重循环。另外从算法中可以看出,每次迭代都只能合并两个子类,这是非常慢的。尽管这么算起来时间复杂度比较高,但还是有不少地方用到了这种聚类方法,在《数学之美》一书的第14章介绍新闻分类的时候,就用到了自顶向下的聚类方法。

       是这样的,谷歌02年推出了新闻自动分类的服务,它完全由计算机整理收集各个网站的新闻内容,并自动进行分类。新闻的分类中提取的特征是主要是词频因为对不同主题的新闻来说,各种词出现的频率是不一样的, 比如科技报道类的新闻很可能出现的词就是安卓、平板、双核之类的,而军事类的新闻则更可能出现钓鱼岛、航母、歼15、歼20这类词汇。一般对每篇文章提取TF-IDF(词频-逆文本频率值)特征,组成一个高维的特征向量(每一维表示一个词出现的TF-IDF值),然后采用监督学习或者非监督学习的方法对新闻进行分类。在已知一些新闻类别的特征的情况下,采用监督学习的方法是很OK的。但是在未知的情况下,就采用这种agglomerative hierarchical clustering进行自动分类。 这种分类方法的动机很有意思。1998年雅让斯基是某个国际会议的程序委员会主席,需要把提交上来的几百篇论文发给各个专家去评审是否录用。虽然论文的作者自己给定了论文的方向,但方向还是太广,没有什么指导意义。雅让斯基就想到了这个将论文自动分类的方法,由他的学生费罗里安很快实现了。

        另外有一种聚类方法叫做divisive hierarchical clustering(自顶而下),过程恰好是相反的,一开始把所有的样本都归为一类,然后逐步将他们划分为更小的单元,直到最后每个样本都成为一类。在这个迭代的过程中通过对划分过程中定义一个松散度,当松散度最小的那个类的结果都小于一个阈值,则认为划分可以终止。这种方法用的不普遍,原文也没有做更多介绍。

        由于这种层次结构,普通的k-means也被称为一种flat clustering。

 

add@2013.9.11 

        层次聚类如何使用呢,借助matlab就可以实现了,十分简单。首先需要构造距离矩阵Y。这是一个对称矩阵,且对角线元素为0(自己与自己的距离为0)。假设所有样本保存为X,则通过:

Y=pdist(X);
Y=squareform(Y);

      就能够得到距离矩阵。注意pdist可以选择距离度量的方法,例如欧式距离,内积或者余弦夹角。在很多时候这个参数十分重要。

      然后通过Z=linkage(Y)就能产生层次聚类的树结构了。

Z=linkage(Y);

      Z的结果描述起来需要借助实际的例子,大家可以通过matlab help查看,并结合实际结果领悟一下。这棵树可以通过以下指令可视化:

dendrogram(Z) 

      这样就完成了一次层次聚类了(虽然我们什么都没有做大笑

 

---------------------------

jiang1st2010

原文地址:http://blog.csdn.net/jiang1st2010/article/details/7685809

 

 

聚类系列-层次聚类(Hierarchical Clustering)

上篇k-means算法却是一种方便好用的聚类算法,但是始终有K值选择和初始聚类中心点选择的问题,而这些问题也会影响聚类的效果。为了避免这些问题,我们可以选择另外一种比较实用的聚类算法-层次聚类算法。顾...
  • u012500237
  • u012500237
  • 2017年03月23日 10:17
  • 4703

层次聚类的介绍

AGNES算法(自底向上层次聚类)        AGNES(Agglomerative Nesting) 是凝聚的层次聚类算法,如果簇C1中的一个对象和簇C2中的一个对象之间的距离是所有属于不同...
  • u011955252
  • u011955252
  • 2016年03月04日 20:43
  • 4235

层次聚类算法(一)

层次聚类(hierarchical clustering)试图在不同层次上对数据集进行划分,从而形成树形的聚类结构,数据集的划分可采用“自底向上”的聚合策略,也可以采用“自顶向下”的分拆策略。即层次聚...
  • WOJIAOSUSU
  • WOJIAOSUSU
  • 2017年02月25日 17:35
  • 783

聚类算法(一)层次聚类

聚类          聚类是对点集进行考察并按照某种距离测度将他们聚成多个“簇”的过程。聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大。 一、聚类算法介绍 层次法和点分...
  • yinlili2010
  • yinlili2010
  • 2014年10月25日 14:31
  • 2484

聚类分析常用算法原理:KMeans,DBSCAN, 层次聚类

聚类分析是非监督学习的很重要的领域。所谓非监督学习,就是数据是没有类别标记的,算法要从对原始数据的探索中提取出一定的规律。而聚类分析就是试图将数据集中的样本划分为若干个不相交的子集,每个子集称为一个“...
  • leonliu1995
  • leonliu1995
  • 2018年01月01日 10:52
  • 243

层次聚类算法

层次聚类算法是一个应用广泛的算法,小编最近要做对比实验,实现了其中一个版本,为了验证实验效果,结合我国各省会城市之间的距离,对省进行聚类看看效果如何。所有本文从3部分来介绍,首先简介层次聚类算法,然后...
  • mingyong_blog
  • mingyong_blog
  • 2016年06月05日 09:23
  • 5135

层次聚类算法的原理及实现Hierarchical Clustering

层次聚类算法的原理及实现Hierarchical Clustering 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌...
  • zhangyonggang886
  • zhangyonggang886
  • 2016年12月07日 21:41
  • 2708

聚类算法实践(一)——层次聚类、K-means聚类

因为百度云的文章里面有些图片丢失了,想起这篇东西之前被一个中国统计网转发过,所以自己搜了一下想直接把图搞回来,结果发现到处转载的也有不少,自己现在发倒好像是抄袭似的。其实这篇文章里面特别有价值的东西不...
  • sky88088
  • sky88088
  • 2016年05月25日 21:03
  • 6049

使用scipy进行层次聚类和k-means聚类

使用scipy库进行层次聚类和kmeans聚类
  • elaine_bao
  • elaine_bao
  • 2015年12月09日 22:40
  • 14668

层次聚类算法伪码和matlab算法

1. 层次聚类 层次聚类算法与之前所讲的顺序聚类有很大不同,它不再产生单一聚类,而是产生一个聚类层次。说白了就是一棵层次树。介绍层次聚类之前,要先介绍一个概念——嵌套聚类。讲的简单点,聚类的嵌套...
  • zanghui426
  • zanghui426
  • 2015年12月18日 11:02
  • 1904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:聚类(2)——层次聚类 Hierarchical Clustering
举报原因:
原因补充:

(最多只允许输入30个字)