Странные результаты sklearn.metrics.pairwise_distances_argmin_min при расчете евклидова расстояния - PullRequest
0 голосов
/ 11 декабря 2018

Я реализую настроенную версию алгоритма k-средних для обнаружения выбросов.Для этого мне нужно назначить точки данных для центров кластера, а также рассчитать расстояние до соответствующего центра.Мои входные данные - это pandas Dataframes, и я использую sklearn.metrics.pairwise_distances_argmin_min для быстрого вычисления расстояния и метки кластера на одном шаге.

Но при использовании metric = 'euclidean' в качестве аргумента я получаю странные результаты, приводящие кмой алгоритм, чтобы классифицировать большинство точек как выбросы.Пожалуйста, рассмотрите следующий пример:

import numpy as np
import pandas as pd
from sklearn.metrics import pairwise_distances_argmin_min
from sklearn.metrics import pairwise_distances
from scipy.spatial import distance
A = np.array([[3,3],
             [2,2]])
B = np.array([[1,1]])
pair_dist = pairwise_distances(A, B, metric='euclidean')
_, pair_dist_arg = pairwise_distances_argmin_min(A, B, metric='euclidean')
dist_euclid = [distance.euclidean(A[0,:], B), distance.euclidean(A[1,:], B)]
print('pairwise distances: ', pair_dist.flatten())
print('pairwise distances argmin: ', pair_dist_arg)
print('distance.euclidean: ', dist_euclid)

Вывод:

pairwise distances:  [2.82842712 1.41421356]
pairwise distances argmin:  [1.68179283 1.18920712]
distance.euclidean:  [2.8284271247461903, 1.4142135623730951]

Почему я испытываю различные результаты для pairwise_distances и pairwise_distances_argmin_min при использовании евклидова расстояния '?
Результаты идентичны дляразличные другие метрики, которые я пробовал (канберра, ситоблок и т. д.), и, как ни странно, достаточно для l2 (что совпадает с евклидовым).
Кажется, что pairwise_distances_argmin_min слишком много принимает квадратный корень или я что-то упустил?

1 Ответ

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

Вы, похоже, столкнулись с ошибкой в ​​pairwise_distances_argmin_min(..., metric='euclidean'): https://github.com/scikit-learn/scikit-learn/pull/12481/files

Я получаю одинаковый результат для всех трех вычислений, используя sklearn 0.19.1.

Сначала проверьте вашу версию sklearn:

import sklearn
print(sklearn.__version__) # Or print sklearn.__version__ in Python 2.7

Если это 0.20.0, то вы знаете, что это, вероятно, эта ошибка.Эта ошибка выглядит как регрессия (т.е. раньше она работала правильно в предыдущих версиях), поэтому может случиться так, что у вас установлена ​​более поздняя версия sklearn, чем у меня.

Обновлениеsklearn до 0.20.1 (с использованием pip, conda или любого другого менеджера пакетов, который вы используете) должны решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...