Как найти пары значений, превышающие определенное значение косинусного расстояния?
У меня есть массив:
[[ 0.32730174 -0.1436172 -0.3355202 -0.2982458 ]
[ 0.50490916 -0.33826587 0.4315952 0.4850834 ]
[-0.18594801 -0.06028342 -0.24817085 -0.41029227]
[-0.22551994 0.47151482 -0.39798814 -0.14978702]
[-0.3315491 0.05832376 -0.29526958 0.3786153 ]]
Я рассчитал расстояние до косинуса с помощью "pdist", cosine_distance=1-pdist(array, metric='cosine')
и получил массив расстояний:
[-0.14822659 0.51635946 0.09485546 -0.38855427 -0.82434624 -0.86407176
-0.25101774 0.49793639 -0.07881047 0.41272145]
Теперь я хочу получить только те пары, у которых косинусное расстояние больше 0,4 и меньше 0,49. Я выяснил количество значений, которое больше, чем 0,4, по number_points=len([1 for i in cosine_distance if i >= 0.4])
, Но не в состоянии получить эти пары.
2 ответа
Почему бы и нет
number_points=len([1 for i in cosine_distance if i >= 0.4 and i <= 0.49])
Если вам нужно отслеживать, какая пара находится в диапазоне, используйте enumerate
number_points = [idx for idx, i in enumerate(cosine_distance) if i >= 0.4 and i <= 0.49]
Это дает вам список с индексами пар, который удовлетворяет условиям.
Хитрость в описании вывода для pdist.
Y: ndarray
Возвращает сжатую матрицу расстояний Y. Для каждого и (где), где m - количество исходных наблюдений. Метрика dist(u=X[i], v=X[j]) вычисляется и сохраняется в записи ij.
Документация также ссылается на квадратную форму, чтобы снова сделать вектор расстояния матрицей. Документальное объяснение выходного массива имеет смысл тогда. ij
позиция в документации будет первым и вторым индексом матрицы, созданной squareform
операция. Затем мы можем получить любое расстояние относительно каждой пары точек.
distance_matrix = squareform(cosine_distances_array)
points_to_keep = []
for (i in range(len(points)-1)):
for (j in range(i+1, len(points))):
if(distance_matrix[i,j] > 0.4):
points_to_keep.push((points[i], points[j]))
print points_to_keep