系统相关
首页 > 系统相关> > python – 具有有限内存的kmeans聚类

python – 具有有限内存的kmeans聚类

作者:互联网

我正在App Engine上开发一个应用程序,并且正在使用SciPy的kmeans2.

群集运行时,我收到此错误:

服务1个请求后,超出159.852 MB的软私有内存限制

这是我正在做的,color_data将是大约500万x,y,z点:

def _cluster(color_data, k):
  """ Clusters colors and return top k 

      Arguments:
      ----------
        color_data
          TYPE: list
          DESC: The pixel rgb values to cluster
        k
          TYPE: int
          DESC: number of clusters to find in the colors

      Returns:
      --------
        sorted_colors
          TYPE: list
          DESC: A list of rgb centroids for each color cluster
  """

  # make rgbs into x,y,z points
  x,y,z = [],[],[]
  for color in color_data:
    x.append(color[0])
    y.append(color[1])
    z.append(color[2])

  # averaged_colors are points at center of color clusters
  # labels are cluster numbers for each point
  averaged_colors, labels = kmeans2(array(zip(x,y,z)), k, iter=10)

  # get count of nodes per cluster
  frequencies = {}
  for i in range(k):
    frequencies[i] = labels.tolist().count(i)

  # sort labels on frequency
  sorted_labels = sorted(frequencies.iteritems(), key=itemgetter(1))

  # sort colors on label they belong to
  sorted_colors = []
  for l in sorted_labels:
    sorted_colors.append(tuple(averaged_colors[l[0]].tolist()))

  return sorted_colors

我怎么能在128MB以下的内存中做到这一点?

编辑:
在我的本地计算机上,运行我的应用程序显示我的活动监视器中使用了大约500 MB的内存

解决方法:

不要使用所有像素.

如果你只使用10%或更少的像素,K-Means通常会返回几乎相同的结果.因为它计算均值,并且平均值不再有太大变化,如果添加更多信息,除非数据的分布不同.

仅使用10%的像素应该可以使您的应用程序使用更少的内存.

标签:python,cluster-analysis,k-means,google-app-engine,scipy
来源: https://codeday.me/bug/20190709/1408992.html