VLFeat 分层 k-means:词汇树中的节点数

Posted

技术标签:

【中文标题】VLFeat 分层 k-means:词汇树中的节点数【英文标题】:VLFeat hierarchical k-means: number of nodes in the vocabulary tree 【发布时间】:2014-06-15 19:22:09 【问题描述】:

在hierarchical k-means中,深度为D,分支因子K的词汇树应有节点总数(不包括根节点)如下:

nodes = K + K^2 + ... + K^D
nodes = (K^(D+1)-K)/(K-1)  

但是,vl_hikmeanshist 给出的直方图带有一个额外的 bin。在他们的website上,节点数计算为:

nodes = (K^(D+1)-1)/(K-1)  

他们还说他们“不计算没有信息的根”。那么为什么他们的公式不同呢?他们没有在网站上发布他们的联系方式,所以我无法询问他们。有人能解释一下这个问题吗?

【问题讨论】:

您好,您知道在vl_hikmean 创建词汇树后如何检索图像吗?我想知道我们如何获得倒排索引文件。谢谢 【参考方案1】:

不包括根节点,因为它不包含其他信息。根节点将始终是数据集的平均值。见here

举个简单的例子,假设您在深度为 2 的树中有 5 个节点。对于您的公式,您将有 (5^3-5)/(4)=120/4=30 节点(不包括根节点)

他们的公式只是在根节点中添加:(5^3-1)/(4)=124/4=31 节点。这与之前的 30 加一个根节点相同。

基本上,它们都是同一个意思。只知道额外的 bin 是根目录,并没有真正的用处。

【讨论】:

谢谢,但是根据我的问题中的附加链接(以及您提供的链接),VLFeat 说他们已经排除了根节点。但是他们的函数 vl_hikmeanshist 仍然为 K=5, D=2 输出 31 个节点。这就是我问的原因。还是他们忘记从输出直方图中删除额外的 bin(即根节点)? 我明白你在说什么。我想这有点错,因为它是open source。 +1。嗯,这有点奇怪,因为它们的函数和方程都说 31 个节点。他们声称两次(在两个链接中)他们不计算根节点。无论如何,我要从 vl_hikmeanshist 的输出中删除一个 bin,但不知道哪个 bin 对应于根节点? 你可以使用:rootbin = bins(bins==mean(data)); 如果这不能产生完全匹配,你可能需要类似rootbin=min(abs(bins-mean(data))); 不,我想从直方图中删除 bin,即 vl_hikmeanshist 的输出,而不是词汇树中根节点的中心(他们已经删除了它)。刚刚在 K=3,D=2(总共 12 个节点)的小树上进行了测试。树确实有 12 个节点,但直方图是 13-D。经过多次测试,结果表明直方图的第一个 bin 对应于根节点,因为它始终等于传递给 vl_kmeanshist 函数的特征(数据)的数量。无论如何,谢谢你的帮助。我会等到 VLFeat 修复错误,即您对他们的错字的猜测是正确的,然后接受您的回答

以上是关于VLFeat 分层 k-means:词汇树中的节点数的主要内容,如果未能解决你的问题,请参考以下文章

matlab配置vlfeat库(v0.9.18)

不知道“k”的OpenCV中的分层k-Means

将字符串表示为决策树中的特征,词汇量为 200(带或不带 one-hot 编码)

Tensorflow 中可扩展、高效的分层 Softmax?

初窥图像识别与k-means算法

分层k-means聚类和HCPC