【发布时间】:2017-10-29 19:34:32
【问题描述】:
我有一组形状为 (1000,) 的向量(图像的向量表示),我需要找出其中哪些与其他向量最密切相关(表示该实体的最相关图像)。我正在经历许多算法,比如 kNN,但我没有任何训练有素的数据来比较这些向量,我只有这些向量。谁能告诉我我需要使用哪种算法来实现这一目标??
【问题讨论】:
标签: python algorithm vector graph tree
我有一组形状为 (1000,) 的向量(图像的向量表示),我需要找出其中哪些与其他向量最密切相关(表示该实体的最相关图像)。我正在经历许多算法,比如 kNN,但我没有任何训练有素的数据来比较这些向量,我只有这些向量。谁能告诉我我需要使用哪种算法来实现这一目标??
【问题讨论】:
标签: python algorithm vector graph tree
这完全取决于嵌入的类型/如何计算这些表示,如果不使用这个假设,就没有有效的算法!
你需要某种度量,它能够评估两个向量的相似度!
当你有这个指标时,天真的方法是一个循环比较所有:
# 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 的 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']
再说一遍:第一句话是这里最重要的!
【讨论】: