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的使用几乎一样):
1
2from scipy.cluster.hierarchyimport fclusterdata
fclusterdata(matData,t=0.99,criterion='inconsistent',metric='euclidean',method='average',R=None)#这个不需要计算linkage就能直接出结果了
这里用到的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 这个阈值进行合作。
1
2
3
4
5
6
7
8from scipy.cluster.hierarchyimport linkage ,fcluster,fclusterdata
import pandas as pd
data= pd.read_csv('/home/rickey/文档/学习/数据挖掘与数据仓库/数据挖掘作业/三围数据',sep='t',index_col=0)
matData= data.as_matrix()
distance= spatial.distance.pdist(matData)
linkresult= linkage(distance,method='average',metric='euclidean')
fcluster(linkresult,t=0.99,criterion='inconsistent',depth=2,R=None,monocrit=None)#这个需要先计算linkage,再出结果
dendrogram(linkresult,get_leaves=False,show_leaf_counts=False)#这个可以绘制出树形图
这是更复杂一些的实现形式,主要有四个函数要注意,分别是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里面关于层次聚类的函数还有不少,我也没有搞懂,这里就不多说了。