在Python中优化集群

时间:2013-05-02 21:04:04

标签: python optimization scipy cluster-analysis

我为自己的问题编写了自己的聚类算法(糟糕,我知道)。它运作良好,但可以更快地工作。

算法采用值列表(1D)和输入一样,其工作方式如下:

  1. 对于每个群集,计算距离最近邻居群集的距离
  2. 选择与邻居B的距离最小的群集A
  3. 如果A和B之间的距离小于阈值,返回
  4. 结合A和B
  5. 转到1。
  6. 我可能在这里重新发明了一个轮子。

    这是我的粗野代码,如何让它更快?我已经安装了Scipy和Numpy,如果有现成的东西

    #cluster center as simple average value
    def cluster_center(cluster):
      return sum(cluster) / len(cluster)
    
    #Distance between clusters
    def cluster_distance(a, b):
      return abs(cluster_center(a) - cluster_center(b))
    
    while True:
      cluster_distances = []
    
      #If nothing to cluster, ready
      if len(clusters) < 2:
        break
    
      #Go thru all clusters, calculate shortest distance to neighbor  
      for cluster in clusters:
        cluster_distances.append((cluster, sorted([(cluster_distance(cluster, c), c) for c in clusters if c != cluster])[0]))
    
      #Find out closest pair 
      cluster_distances.sort(cmp=lambda a,b:cmp(a[1], b[1]))
    
      #Check if distance is under threshold 15
      if cluster_distances[0][1][0] < 15:
         a = cluster_distances[0][0]
         b = cluster_distances[0][1][1]
         #Combine clusters (combine lists)
         a.extend(b)
    
         #Form a new cluster list
         clusters = [c[0] for c in cluster_distances if c[0] != b]
      else:
        break
    

1 个答案:

答案 0 :(得分:2)

通常,术语&#34;聚类分析&#34;仅用于多变量分区。因为在1d中,您实际上可以排序您的数据,并且通过这种方式更容易解决大部分问题。

因此,为了加快您的方法,对数据进行排序!并重新考虑你当时需要做的事情。

对于更高级的方法:进行核密度估计,并将局部最小值作为分裂点。