Как найти пары значений, превышающие определенное значение косинусного расстояния? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть массив:

[[ 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 ]

0 голосов
/ 24 декабря 2018

Почему бы не

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]

. Это даст вам список с индексамипары, удовлетворяющие условиям.

0 голосов
/ 06 декабря 2018

Хитрость в описании вывода для pdist .

Y: ndarray

Возвращает сжатую матрицу расстояний Y. Для каждого и (где), где m - количество исходных наблюдений.Метрика dist (u = X [i], v = X [j]) вычисляется и сохраняется в записи ij.

Документация также ссылается на squareform , чтобы сделатьРасстояние вектора матрицы снова.Документальное объяснение выходного массива имеет смысл тогда.Позиция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...