【问题标题】:torch7: Unexpected 'counts' in k-Means Clusteringtorch7:k-Means 聚类中的意外“计数”
【发布时间】:2016-09-27 11:43:53
【问题描述】:

我正在尝试使用以下代码段对一组图像应用 k-means 聚类(图像加载为 float torch.Tensors):

print('[Clustering all samples...]')
local points = torch.Tensor(trsize, 3, 221, 221)
for i = 1,trsize do
  points[i] = trainData.data[i]:clone() -- dont want to modify the original tensors
end
points:resize(trsize, 3*221*221) -- to convert it to a 2-D tensor
local centroids, counts = unsup.kmeans(points, total_classes, 40, total_classes, nil, true)
print(counts)

当我观察 counts 张量中的值时,我观察到它包含意外值,以某些条目的形式超过 trsize,而 documentation 表示 counts 存储每个质心。我预计这意味着counts[i] 等于trsize 中属于质心centroids[i] 的集群的样本数。我是不是这样假设错了?

如果确实如此,那么样本到质心不应该是一个硬分配(即不应该将counts[i]trsize 相加,显然情况并非如此与我的聚类)?我在这里遗漏了什么吗?

提前致谢。

【问题讨论】:

    标签: k-means torch


    【解决方案1】:

    在当前版本的代码中,计数为accumulated after each iteration

    for i = 1,niter do
      -- k-means computations...
    
      -- total counts
      totalcounts:add(counts)
    end
    

    所以最后counts:sum()niter的倍数。

    作为一种解决方法,您可以使用回调来获取最终计数(非累积):

    local maxiter = 40
    
    local centroids, counts = unsup.kmeans(
      points,
      total_classes,
      maxiter,
      total_classes,
      function(i, _, totalcounts) if i < maxiter then totalcounts:zero() end end,
      true
    )
    

    作为替代方案,您可以使用 vlfeat.torch 并在 kmeans 之后显式量化您的输入点以获得这些计数:

    local assignments = kmeans:quantize(points)
    
    local counts = torch.zeros(total_classes):int()
    
    for i=1,total_classes do
      counts[i] = assignments:eq(i):sum()
    end
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2021-08-19
      • 2011-08-13
      • 2013-08-08
      • 2013-02-14
      • 2018-01-14
      • 2013-01-11
      • 2016-02-01
      • 2013-02-07
      相关资源
      最近更新 更多