2014-10-31 82 views
0

scikit-learn函数pairwise_distances提供了数组X的距离矩阵。 但对于某些输入,结果似乎并不准确。Sci-kit学会pairwise_distances是不精确的?

实施例:

from sklearn.metrics.pairwise import pairwise_distances 
X = [[-0.903858372568, -0.5521578], [-0.903858372568, -0.55215782]] 
print pairwise_distances(X) 

给出以下输出:

[[ 0. 0.] 
[ 0. 0.]] 

虽然的0.00000002的距离。

第二实施例:

X = [[-0.903858372568, -0.5521578], [-0.903858372568, -0.552157821]] 

给出

[[ 0.00000000e+00 2.10734243e-08] 
[ 2.10734243e-08 0.00000000e+00]] 

在这里有一个距离,但仅是校正多达第一位数。

对于我的应用来说,如果尽管有距离,输出可以为零,但并不理想。 有没有提高精度的好方法?

+1

在sklearn的成对距离函数对速度进行了优化。他们将欧氏距离分解成两个范数和一个矩阵积,结果对于数值误差是不稳定的。 – eickenberg 2014-10-31 13:47:46

+1

如果您的应用程序依赖于'2e-7'的差异,您应该认真考虑重新调整您的公式/数据的缩放比例... – eickenberg 2014-10-31 13:48:33

+1

另请参阅[here](https://github.com/scikit-learn/scikit-learn/issues/ 2914) – eickenberg 2014-10-31 13:49:29

回答

2

我没有挖掘为什么scikit学会给出这样的不准确的结果,但它似乎scipy提供更好的精度。尝试:

from scipy.spatial.distance import pdist, squareform 
squareform(pdist(X)) 

例如,

X = [[-0.903858372568, -0.5521578], [-0.903858372568, -0.552157821]] 

给出

array([[ 0.00000000e+00, 2.10000000e-08], 
     [ 2.10000000e-08, 0.00000000e+00]])