我有一组形状的矢量(1000,)(它的图像矢量表示),我需要找出它们中哪一个与其他的最密切相关(最相关的图像来表示该实体)。我正在经历许多算法,如kNN,但我没有任何经过训练的数据来比较这些矢量,我只有这些矢量。谁能告诉我需要使用哪种算法来实现这个目标?
答案 0 :(得分:1)
这完全取决于嵌入的类型/如何计算这些表示,并且没有使用此假设就没有工作算法!
您需要某种指标,它能够评估两个向量的相似性!
当你有这个指标时,天真的方法是比较所有的循环:
# linear-search
max_similarity = -inf
max_vector
for vector in all_vectors:
similarity = similarity(my_vector, vector)
if similarity > max_similarity:
max_similarity = similarity
max_vector = vector
对于某些指标,上述情况可以通过度量树和类似方法(基本上是kNN算法的内部)加速,这些方法试图使用基础度量的假设来修剪一些候选者(不是查看所有候选者)(结果在潜在的加速)。这些算法在高维度上变慢,但我不确定1000是否已经太多了!
如果您的假设/相似性基于欧几里德指标(使用sklearn' s KDTree),则为一个示例:
from sklearn.neighbors import KDTree
X = np.vstack(my_vectors)
tree = KDTree(X)
dist, ind = tree.query(my_vector, k=1) # get nearest neighbor
这是一个很好的方法的一个例子是OpenFace,它完全建立在将面部映射到欧几里德空间的想法上(类似的面具有低欧氏距离)! (基础论文:FaceNet)
还有BallTree支持更多指标!
from sklearn.neighbors import KDTree, BallTree
KDTree.valid_metrics
['cityblock', 'p', 'l2', 'chebyshev', 'l1', 'euclidean', 'minkowski',
'infinity', 'manhattan']
BallTree.valid_metrics
['braycurtis', 'cityblock', 'p', 'hamming', 'dice', 'l2', 'rogerstanimoto',
'wminkowski', 'chebyshev', 'russellrao', 'sokalmichener', 'matching', 'l1',
'haversine', 'pyfunc', 'kulsinski', 'seuclidean', 'mahalanobis', 'euclidean',
'minkowski', 'sokalsneath', 'infinity', 'manhattan', 'jaccard', 'canberra']
再说一遍:第一句是最重要的一句!