Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中优化集群_Python_Optimization_Scipy_Cluster Analysis - Fatal编程技术网

在Python中优化集群

在Python中优化集群,python,optimization,scipy,cluster-analysis,Python,Optimization,Scipy,Cluster Analysis,我为我的问题编写了自己的聚类算法(我知道这很糟糕)。它工作得很好,但可以工作得更快 算法将值列表(1D)作为输入,其工作原理如下: 对于每个簇,计算到最近邻居簇的距离 选择与邻居B距离最小的群集A 如果A和B之间的距离小于阈值,返回 结合A和B 转到1 我可能在这里重新发明了一个轮子 这是我的暴力foce代码,如何让它更快?我已经安装了Scipy和Numpy,如果有现成的东西的话 #cluster center as simple average value def cluster_center

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

算法将值列表(1D)作为输入,其工作原理如下:

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

    这是我的暴力foce代码,如何让它更快?我已经安装了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
    
    #群集中心作为简单平均值
    def集群_中心(集群):
    返回和(群集)/len(群集)
    #簇间距离
    def集群_距离(a、b):
    返回abs(仪表盘中心(a)-仪表盘中心(b))
    尽管如此:
    群集距离=[]
    #如果没有要群集的内容,请准备就绪
    如果len(簇)<2:
    打破
    #遍历所有簇,计算到邻居的最短距离
    对于集群中的集群:
    cluster_distance.append((cluster,sorted([(cluster_distance(cluster,c),c)表示集群中的c,如果c!=cluster])[0]))
    #找出最接近的一对
    聚类距离排序(cmp=lambda,b:cmp(a[1],b[1]))
    #检查距离是否低于阈值15
    如果群集距离[0][1][0]<15:
    a=群集距离[0][0]
    b=群集距离[0][1][1]
    #合并簇(合并列表)
    a、 延长(b)
    #形成一个新的集群列表
    集群=[c[0]对于集群距离中的c,如果c[0]!=b]
    其他:
    打破
    
    通常,术语“聚类分析”仅用于多变量分区。因为在1d中,您实际上可以对数据进行排序,这样可以更轻松地解决这些问题

    因此,为了加快处理速度,对数据进行排序!然后重新考虑你需要做什么


    至于一种更高级的方法:进行核密度估计,并寻找局部极小值作为分割点。

    我不知道从哪里开始,但幸运的是,其他人可能会这样做:K-means聚类需要知道聚类的数量,而使用scipy cluster,我不知道从哪里开始:)你重新发明了凝聚聚类吗?看一看:是的,数据已排序。你能解释一下什么是“内核密度估计”吗?在你最喜欢的数学/统计书中查找。或者维基百科。