计算欧氏距离时sklearn.metrics.pairwise_distances_argmin_min的奇怪结果

时间:2018-12-11 12:02:20

标签: python pandas scikit-learn scipy

我正在实现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 :(得分:0)

您似乎在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,那么您可能是此错误。该错误似乎是regression(即以前在以前的版本中可以正常运行),因此可能是您的sklearn的版本比我高。

sklearn更新为0.20.1(使用pipconda或您使用的任何软件包管理器)应该可以解决问题。