我正在尝试使用以下代码段对一组图像(图像以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]
},这显然不是我的聚类的情况)?我在这里错过了什么吗?
提前致谢。
答案 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