torch7:k-均值聚类中出现意外 'counts'

torch7: Unexpected 'counts' in k-Means Clustering

我正在尝试使用以下代码段对一组图像应用 k-means 聚类(图像加载为浮点 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,我的聚类显然不是这种情况)?我在这里遗漏了什么吗?

提前致谢。

在当前版本的代码中,计数为 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