python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法

时间:2022-07-02 21:25:07

python机器学习包里面的cluster提供了很多聚类算法,其中ward_tree实现了凝聚层次聚类算法。

但是没有看明白ward_tree的返回值代表了什么含义,遂决定寻找别的实现方式。

经过查找,发现scipy.cluster.hierarchy.fclusterdata能够实现层次聚类。有关这个方法的介绍在:http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.fclusterdata.html

以下是具体的python代码

[python]  view plain copy
  1. #coding=utf8  
  2. """ 
  3. # Author: waleking 
  4. # Created Time : 四  7/26 17:05:07 2012 
  5.   Last Modified: 二  7/31 17:56:26 2012 
  6. # File Name: hierachical.py 
  7. # Description: 
  8. 使用sklearn的层次聚类方法,具体的是ward_tree方法 
  9. 测试数据采用iris数据,sklearn.datasets.load_iris() 
  10. 但是发现sklearn.cluster.ward_tree方法没有看懂,实验*里面的代码 
  11. http://*.com/questions/9873840/cant-get-scipy-hierarchical-clustering-to-work 
  12. """  
  13. import sklearn.datasets as datasets  
  14. import scipy.cluster.hierarchy as hcluster  
  15. import numpy.random as random  
  16. import numpy as np  
  17. import numpy.core.fromnumeric  
  18. import time  
  19.   
  20. import matplotlib.pyplot as plt  
  21.   
  22. def irisSample():  
  23.     iris=datasets.load_iris()  
  24.     irisdata=iris.data  
  25.     result=hcluster.fclusterdata(irisdata, criterion='maxclust',t=3)  
  26.     print("result is %s" % result)  
  27.   
  28. def gaussianSample():  
  29.     timeCheckin=time.clock()  
  30.     X=random.randn(100,100)  
  31.     X[:50,:100]+=10  
  32.     result=hcluster.fclusterdata(X, criterion='maxclust',t=2)  
  33.     print("hierachical clustering on sample with shape(%d,%d) cost %s seconds " % (np.shape(X)[0],np.shape(X)[1],time.clock()-timeCheckin))  
  34.     print("result is %s" % result)  
  35.     clusterA=[label for label in result if(label==1)]  
  36.     clusterB=[label for label in result if(label==2)]  
  37.     print("There are %d samples in cluster 1" %(len(clusterA)))  
  38.     print("ClusterA is %s" % clusterA)  
  39.     print("There are %d samples in cluster 2" %(len(clusterB)))  
  40.     print("ClusterB is %s" % clusterB)  
  41.   
  42. def testPerformanceByNum(start,end,increment):  
  43.     """测试样本数对性能的影响 
  44.     """  
  45.     mapPerformance=dict()  
  46.     for sampleNum in range(start,end,increment):  
  47.         X=random.randn(sampleNum,100)  
  48.         X[:50,:100]+=10  
  49.         timeCheckin=time.clock()  
  50.         result=hcluster.fclusterdata(X,criterion='maxclust',t=2)  
  51.         timeCost=time.clock()-timeCheckin  
  52.         mapPerformance[sampleNum]=timeCost  
  53.     return mapPerformance  
  54.   
  55. def testPerformanceByDim(start,end,increment):  
  56.     """测试维度对性能的影响 
  57.     """  
  58.     mapPerformance=dict()  
  59.     for dim in range(start,end,increment):  
  60.         X=random.randn(100,dim)  
  61.         X[:50,:dim]+=10  
  62.         timeCheckin=time.clock()  
  63.         result=hcluster.fclusterdata(X,criterion='maxclust',t=2)  
  64.         timeCost=time.clock()-timeCheckin  
  65.         mapPerformance[dim]=timeCost  
  66.     return mapPerformance  
  67.   
  68. def showPerformance(mapPerformance):  
  69.     """画图,展现性能 
  70.     """  
  71.     xAxisData=numpy.core.fromnumeric.sort(mapPerformance.keys())  
  72.     yAxisData=[mapPerformance[key] for key in xAxisData]  
  73.     plt.plot(xAxisData,yAxisData,'*-')  
  74.     plt.show()  
  75.   
  76. #irisSample()  
  77. #gaussianSample()  
  78. mapPerformance=testPerformanceByNum(100,3100,100)  
  79. showPerformance(mapPerformance)  
  80. mapPerformance=testPerformanceByDim(100,10100,100)  
  81. showPerformance(mapPerformance)  


我们测试了100维的数据的层次聚类,随机生成100个到3000个服从高斯分布的数据,让50个点的均值不同于其余的点。

测试的性能图如下:

python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法

我们又测试了固定样本数:100个样本,服从高斯分布,其中50个的均值不同于另外的50个。我们实验了维度从100变化到10000,得到性能图如下:

python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法


结论:层次聚类的时间复杂度是O(m^2 n),和Andrew Ng在机器学习课程中的符号相同,其中样本数是m,维度是n,