Просто нарежьте отсортированную матрицу расстояний для первых 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)]
Мое предположение, основанное на слове «заголовок», которое вы здесь использовали, и выбор 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 «городов».
Google имеет довольно простую и быструю реализацию Python с OR-Tools здесь: https://developers.google.com/optimization/routing/tsp.