【发布时间】:2019-05-12 10:09:38
【问题描述】:
我正在实施用于异常值检测的 k-means 算法的定制版本。为此,我需要将数据点分配给聚类中心,并计算到各个中心的距离。我的数据输入是 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 取平方根太多还是我遗漏了什么?
【问题讨论】:
标签: python pandas scikit-learn scipy