Я реализую настроенную версию алгоритма 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 слишком много принимает квадратный корень или я что-то упустил?