按降序查找 10 个最近的点

Find 10 closest points in decreasing order

我正在尝试找出一个点与其他 40,000 个点之间的距离。

每个点都是一个 300 维向量。

我能找到关闭点。如何按降序找到最近的 10 个点?

最近点函数:

from scipy.spatial import distance
def closest_node(node,df):
    closest_index = distance.cdist([node],df.feature.tolist()).argmin()
    return pd.Series([df.title.tolist([closest_index],df.id.tolist()[closest_index]])

此命令return最接近的标题和 ID:

df3[["closest_title","closest_id"]]=df3.feature.apply(lambda row: closest_node(row,df2))

df2- pandas dataframe of 40,000 points (each 300 dimension)

如何return 10 个最近点的标题和索引

谢谢

由于我不知道你的完整代码或数据样本,我的建议是:

不要使用“.argmin()”,只需按距离对列表进行排序,然后 return 排序列表的前十个元素。然后像您已经在做的那样找到他们的指数。

只需对前 10 个节点的排序距离矩阵进行切片。 像这样:

from scipy.spatial import distance

# Find the query node
query_node = df.iloc[10] ## Not sure what you're looking for

# Find the distance between this node and everyone else
euclidean_distances = df.apply(lambda row: distance.euclidean(row, query_node), axis=1)

# Create a new dataframe with distances.
distance_frame = pandas.DataFrame(data={"dist": euclidean_distances, "idx": euclidean_distances.index})
distance_frame.sort("dist", inplace=True)

# nodes
smallest_dist_ixs = distance_frame.iloc[1:10]["idx"]
most_similar_nodes = df.iloc[int(smallest_dist_ixs)]

我根据您在此处使用的单词 'title' 和 300 维向量的选择,假设这些是单词或短语向量。
Gensim其实有一种方法可以根据这个思路得到前N个相似词,速度还算快。

https://tedboy.github.io/nlps/generated/generated/gensim.models.Word2Vec.most_similar.html

>>> trained_model.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]

对于稍微不同的东西,如果您想获得 所有 点之间的最短路径,这也与旅行商问题 (TSP) 略有相似,然后简单地切出前 10 'cities'。

Google 在此处使用 OR-Tools 实现了一个非常简单快速的 python 实现:https://developers.google.com/optimization/routing/tsp.