Hierarchical Clustering(学习Free Mind知识整理)和Hungarian Algorithm

时间:2021-09-11 16:53:44

由上一篇K-medoids算法学完后,搜索到Hierarchical Clustering算法和上篇Free Mind的K-medoid讨论提到的Hungarian Algorithm算法,做一个简单学习。

这篇文章的学习思路还是按照http://blog.pluskid.org/?p=407学习一下。

==================================================================

“聚类的时候如何确定类别数?”

解释:思考了还是不清楚然后看了一些论坛心得。

1、确定聚类个数的方法: 相似系数:指变量或样本间的亲密程度(即阈值),相似系数较大的聚为一类。常用的有夹角余弦、相关系数、指数相似系数。 标尺值:0~25进行分类。 伪F统计量:应该取伪F统计量较大而类数较小的聚类水平。如下图所示,应该分为4类最合适。 统计量R2:应该取R2统计量较大的类数数目。 伪t2统计量:伪t2统计量大说明不应该合并这两类,应该取合并前的水平。 实际意义:根据你做得试验,必须有实际意义。比 ...
本文来自: 人大经济论坛 SPSS专版 版,详细出处参考:
http://bbs.pinggu.org/forum.phpmod=viewthread&tid=162067&page=1


2、这个问题是聚类分析历史中尚未完全解决的问题之一,主要的障碍是对类的结构和内容很难给出一个统一的定义,这样就给不出从理论上和实践中都可行的虚无假设。往往在实际应用中人们主要根据研究的目的,从使用的角度出发,选择合适的分类数。Demirmen(1972)曾提出了根据树状结构图来分类的准则:

Ø1.任何类都必须在邻近各类中是突出的,即各类重心之间距离必须大; Ø2.各类所包含的元素都不要过分地多; Ø3.分类的数目应该符合使用的目的; Ø4.若采用几种不同的聚类方法处理,则在各自的聚类结果上应该发现相同的类

这个问题正是分类(Categorization or Classification)(按照某种标准给对象贴标签(label),再根据标签来区分归类)和聚类(事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程)的关系主要所在吧。

区别是,分类是事先定义好类别 ,类别数不变 。分类器需要由人工标注的分类训练语料训练得到,属于有指导学习范畴。聚类则没有事先预定的类别,类别数不确定。 聚类不需要人工标注和预先训练分类器,类别在聚类过程中自动生成 。分类适合类别或分类体系已经确定的场合,比如按照
国图分类法分类图书;聚类则适合不存在分类体系、类别数不确定的场合,一般作为某些应用的前端,比如多文档文摘、搜索引擎结果后聚类(元搜索)等。
      分类的目的是学会一个分类函数或分类模型(也常常称作分类器 ),该模型能把数据库中的数据项映射到给定类别中的某一个类中。 要构造分类器,需要有一个训练样本数据集作为输入。训练集由一组数据库记录或元组构成,每个元组是一个由有关字段(又称属性或特征)值组成的特征向量,此外,训练样本还有一个类别标记。一个具体样本的形式可表示为:(v1,v2,...,vn; c);其中vi表示字段值,c表示类别。分类器的构造方法有统计方法、
机器学习方法、神经网络方法等等。
      聚类(clustering)是指根据“物以类聚”原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似。与分类规则不同,进行聚类前并不知道将要划分成几个组和什么样的组,也不知道根据哪些空间区分规则来定义组。其目的旨在发现空间实体的属性间的函数关系,挖掘的知识用以属性名为变量的数学方程来表示。聚类技术正在蓬勃发展,涉及范围包括数据挖掘、统计学、
机器学习、空间数据库技术、生物学以及市场营销等领域,聚类分析已经成为数据挖掘研究领域中一个非常活跃的研究课题。常见的聚类算法包括:K-均值聚类算法、K-中心点聚类算法、CLARANSBIRCH、CLIQUE、DBSCAN等。

==================================================================

对于上面的问题解决方法:

层次聚类 Hierarchical Clustering:

 http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/hierarchical.html

层次聚类算法:

给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
  1. 将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.
  2. 找到最接近的两个类并合并成一类, 于是总的类数少了一个.
  3. 重新计算新的类与所有旧类之间的距离.
  4. 重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

由于层次聚类计算量巨大,所以通常不用来计算大量的数据,不过可以用层次聚类来选取K-means算法的初始类中心。

该方法分为两类:agglomerative hierarchical clustering(自下而上)和divisive hierarchical clustering(自顶而下)【http://blog.csdn.net/jwh_bupt/article/details/7685809

python实现:http://www.cnblogs.com/Key-Ky/p/3440684.html

自下而上的python实现:https://github.com/intergret/snippet/blob/master/HAC.py

                                       http://www.oschina.net/code/snippet_176897_14731

matlab待实现:实现参考链接

                       http://blog.sina.com.cn/s/blog_69c3ea2b0100nitu.html                          

                       http://www.cnblogs.com/wentingtu/archive/2012/01/04/2311533.html

=================================================================

匈牙利算法Hungarian Algorithm:

http://blog.csdn.net/erpindao/article/details/8451524

http://blog.csdn.net/allenlsy/article/details/5004360

http://ycool.com/post/cfnym64

http://www.cnblogs.com/kakamilan/archive/2012/07/14/2590879.html

****************************************************************************

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。区别二分图,关键是看点集是否能分成两个独立的点集。

关于网络流的介绍:http://blog.csdn.net/y990041769/article/details/21026445

                                                               http://www.cnblogs.com/hxsyl/p/4185530.html

最大流的含义,就是说从源点到经过的所有路径的最终到达汇点的所有流量和。

===================================================================

最后给一个文中提到的贪婪算法:http://blog.csdn.net/effective_coder/article/details/8736718

这个算法有兴趣的可以去学习一下。

===================================================================

最后感谢文中所有博友Hierarchical Clustering(学习Free Mind知识整理)和Hungarian Algorithm