Faiss的第三个示例 -IVFPQ

Faiss的第三个示例 -IVFPQ

flyfish

import mkl
mkl.get_max_threads()
import numpy as np

d = 64                           # dimension
nb = 100000                      # database size
nq = 10000                       # nb of queries
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.

import faiss

nlist = 100
m = 8
k = 4
quantizer = faiss.IndexFlatL2(d)  # this remains the same
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
                                  # 8 specifies that each sub-vector is encoded as 8 bits
index.train(xb)
index.add(xb)
D, I = index.search(xb[:5], k) # sanity check
print(I)
print(D)
index.nprobe = 10              # make comparable with experiment above
D, I = index.search(xq, k)     # search
print(I[-5:])
[[   0   78  608  159]
 [   1 1063  555  380]
 [   2  304  134   46]
 [   3   64  773  265]
 [   4  288  827  531]]
[[1.6237772 6.123259  6.4341326 6.5553474]
 [1.3901404 5.9622483 5.996616  6.4863024]
 [1.7028744 6.1207047 6.190813  6.49708  ]
 [1.8114672 6.5492435 6.670644  6.8599277]
 [1.4824215 5.802374  6.1927524 6.3873277]]
[[ 9900  8746  9853 10437]
 [10494 10507 11373  9014]
 [10719 11291 10424 10138]
 [10122  9638 11113 10630]
 [ 9229 10304  9644 10370]]

代码不同的地方

index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)

向量量化的方法中比较典型的代表是乘积量化(PQ, Product Quantization)方法,它将特征空间分解为多个低维子空间的笛卡尔乘积,然后单独地对每一个子空间进行量化。在训练阶段,每一个子空间经过聚类后得到 k k k个类心(即量化器),所有这些类心的笛卡尔乘积构成了一个对全空间的密集划分,并且能够保证量化误差比较小;经过量化学习后,对于给定的查询样本,通过查表的方式可以计算出查询样本和库中样本的非对称距离(Asymmetric Distance Estimation with Sketches for Similarity Search in High-dimensional Spaces)。乘积量化方法虽然在近似样本间的距离时比较的精确,但是乘积量化方法的数据结构通常要比二值哈希码的复杂,它也不能够得到低维的特征表示,此外为了达到良好的性能必须加上不对称距离,并且它还需要每个维度的方差比较平衡,如果方差不平衡,乘积量化方法得到的结果很差。

如果想了解Product Quantization这个单词是怎么回事,请看论文
《Product Quantization for Nearest Neighbor Search》

sanity check的解释
知乎有趣的回答
「Sanity Check」可以翻成「合理性检验」或「靠谱检验」,指快速评估计算结果或分析结论是否合理,是否根本没有正确的可能。

在咨询公司里,这个方法还有个昵称叫「闻闻味儿」,「Smell Check」。通俗地说,就是掂量一下给结论的人「有病没病」。

比如纳米的爷爷对恐龙的身材就有一个非常好的「靠谱检验」。

「纳米技术之父」理查德·费曼先生在《你干吗在乎别人怎么想?》一书中自述到:

我家有一套《大英百科全书》,父亲常让我坐在他的膝上,给我念里边的章节。比如有一次念到霸王龙,书里说,「恐龙的身高有25英尺,头6英尺宽。」父亲停顿了念书,对我说,「唔,让我们想一下这是什么意思。这也就是说,要是恐龙站在门前的院子里,那么它的身高足以使它的脑袋凑着咱们这两层楼的窗户,可它的脑袋却伸不进窗户,因为它比窗户还宽呢!」就是这样,他总是把所教的概念变成可触可摸,有实际意义的东西。

把抽象的结论跟可触可摸、有实际意义的东西相比较,就是「靠谱检验」的基本方法。

用这个方法,如果有人说「霸王龙有25米高,头有6厘米宽」,我们立刻就可以发现TA酒还没醒。
参考
《图像检索:基于内容的图像检索技术》

你可能感兴趣的:(深度学习)