torch7:k-均值聚类中出现意外 'counts'
torch7: Unexpected 'counts' in k-Means Clustering
我正在尝试使用以下代码段对一组图像应用 k-means 聚类(图像加载为浮点 torch.Tensor
s):
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
我正在尝试使用以下代码段对一组图像应用 k-means 聚类(图像加载为浮点 torch.Tensor
s):
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