火炬7:意外'计数'在k-Means聚类中

时间:2016-05-29 16:19:59

标签: k-means torch

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

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表示{ {1}}存储每个质心的计数。我预计这意味着counts等于属于具有质心counts[i]的群集的trsize中的样本数。这样做我错了吗?

如果确实如此,那么样本到质心不应该是硬分配(即不应该centroids[i]总和到counts[i] },这显然不是我的聚类的情况)?我在这里错过了什么吗?

提前致谢。

1 个答案:

答案 0 :(得分: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