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

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方法没有看懂,实验stackoverflow里面的代码 
  11. http://stackoverflow.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个点的均值不同于其余的点。

测试的性能图如下:


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



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值