BAFIMINARMTO

BA0662877255412996

FI6620295468268400

MI8772950754564138

NA2554687540219869

RM4122685642190669

TO9964001388696690

这是一个距离矩阵。不管是scipy还是fastcluster,都有一个计算距离矩阵的步骤(也可以不用)。距离矩阵是冗余的,因为它是对称的。scipy里面的文档好多的关于数学上的英文,让我都搞糊涂了。distance = spatial.distance.pdist(data),这段代码里,data是一个矩阵,但不是距离矩阵,而是如http://www.shahuwang.com/?p=952 这篇文章中用到的数据形式,而最后算出来的distance只是一个数组,并不是矩阵,而且是一维数组,这是为什么呢?仔细看上面的那个矩阵,就知道我们只需要记录对角线上或者下面的一部分就可以了。废话不说,来看最简单的一个层次聚类实现(我现在主要将scipy的,fastcluster的使用几乎一样):

这里用到的matData来自于:http://www.shahuwang.com/?p=952 用到的数据,是矩阵形式的。输出的结果如下:

array([15, 19, 20, 26, 23, 10, 26, 23, 18, 21, 20, 22, 10, 20, 1, 18, 11,

8, 4, 18, 21, 29, 25, 17, 18, 20, 24, 23, 3, 19, 12, 13, 15, 9,

18, 25, 16, 28, 5, 17, 25, 17, 1, 15, 7, 4, 14, 6, 20, 2, 4,

3, 9, 5, 2, 23, 1, 9, 25, 15, 23, 27, 16, 11, 22, 20, 12])

结果的意思,就是说我的矩阵的第一个数据现在被分到了第15个类中,后面的也都是这个意思,自己再整理一下,就能输出美观直观的结果了。下面主要来讲一下fclusterdata里面的参数的意思:

matData,这是要聚类的数据,t是一个阈值,小于1大于0,你可以根据输出结果来设置这个阈值。criterion,是一个标准,它主要是确定形成最后结果(如上面的那个array)需要满足什么条件,这个主要和 t 这个阈值进行合作。

这是更复杂一些的实现形式,主要有四个函数要注意,分别是pdist,linkage,fcluster,dendrogram。

这段代码用的数据和前面那段是一样的,结果也是一样的。distance是一个距离数组(距离矩阵的一边角),之前已经说明了pdist的作用了。linkage返回的是一个4×(n-1)的矩阵。比如我的数据是67个,返回的则是一个4×66的矩阵。这个矩阵的意思,scipy文档上用的是这段话:“A 4 by

matrixZis returned. At the

-th iteration, clusters with indicesZ[i, 0]andZ[i, 1]are combined to form cluster

. A cluster with an index less than

corresponds to one of the

original observations. The distance between clustersZ[i, 0]andZ[i, 1]is given byZ[i, 2]. The fourth valueZ[i, 3]represents the number of original observations in the newly formed cluster.”

英语不济,不是很看得明白。大概是说Z[i,0],Z[i,1]是组成n+i簇的之类的吧。

fcluster这个函数,则是把linkage算出的结果,形成一个平面数组,形成最后的聚类结果呈现出来。里面的参数和fclusterdata里面的意思是一样的。

fcluster的这段代码和fclusterdata的代码相比,多了一些,不过,好处就是能设置更多的参数。

dendrogram的参数设置非常多,没有完全搞明白,不过它会输出一个字典,和一幅图。字典里面有四个key,而图则是树形图,如下:


不过,我觉得这个图的用途不是很大,数据量一多,就什么都看不到了。

scipy里面关于层次聚类的函数还有不少,我也没有搞懂,这里就不多说了。