Python sklearn';s成对距离,度量=';相关性';做

Python sklearn';s成对距离,度量=';相关性';做,python,scikit-learn,pairwise-distance,Python,Scikit Learn,Pairwise Distance,我在这个函数中输入了不同的值,并观察了输出。但我找不到一个可预测的输出模式 然后我试着去挖掘这个模型本身,但是它让人困惑,因为它可以做很多不同的计算 根据: Compute the distance matrix from a vector array X and optional Y. 我看到它返回的高度和宽度矩阵等于输入的嵌套列表的数量,这意味着它正在比较每个列表 但除此之外,我很难理解它在做什么,价值观从何而来 我尝试过的例子: pairwise_distances([[1]], met

我在这个函数中输入了不同的值,并观察了输出。但我找不到一个可预测的输出模式

然后我试着去挖掘这个模型本身,但是它让人困惑,因为它可以做很多不同的计算

根据:

Compute the distance matrix from a vector array X and optional Y.
我看到它返回的高度和宽度矩阵等于输入的嵌套列表的数量,这意味着它正在比较每个列表

但除此之外,我很难理解它在做什么,价值观从何而来

我尝试过的例子:

pairwise_distances([[1]], metric='correlation')
>>> array([[0.]])

pairwise_distances([[1], [1]], metric='correlation')
>>> array([[ 0., nan],
>>>        [nan,  0.]])

# returns same as last input although input values differ
pairwise_distances([[1], [2]], metric='correlation')
>>> array([[ 0., nan],
>>>        [nan,  0.]])

pairwise_distances([[1,2], [1,2]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>        [2.22044605e-16, 0.00000000e+00]])

# returns same as last input although input values differ
# I incorrectly expected more distance because input values differ more
pairwise_distances([[1,2], [1,3]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>       [2.22044605e-16, 0.00000000e+00]])

使用Scipy计算相关距离

Compute the distance matrix from a vector array X and optional Y.
如果scipy为相同的输入返回
0.0
,我不明白sklearn
2.22044605e-16
值来自何处

# Scipy
import scipy
scipy.spatial.distance.correlation([1,2], [1,2])
>>> 0.0

# Sklearn
pairwise_distances([[1,2], [1,2]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>        [2.22044605e-16, 0.00000000e+00]])

我不是在寻找一个高层次的解释,而是一个如何计算数字的示例。

可以在这里找到距离度量:

具体而言,相关性如下:

u和v之间的相关距离定义为

导入sklearn
X=[[1,2,3,4],[2,2,4,4],[4,3,2,1]]
D=sklearn.metrics.pairwise_距离(X,metric='correlation')
印刷品(D)
输出:

[[0.         0.10557281 2.        ]
 [0.10557281 0.         1.89442719]
 [2.         1.89442719 0.        ]]
D
是一个距离矩阵,使得D{i,j}是给定矩阵
X
的第i和第j个向量之间的距离

import scipy

X = [[1, 2, 3, 4], [2, 2, 4, 4], [4, 3, 2, 1]]

c_00 = scipy.spatial.distance.correlation(X[0], X[0])        # c_00 = 0.0
c_01 = scipy.spatial.distance.correlation(X[0], X[1])        # c_01 = 0.10557280900008414
c_02 = scipy.spatial.distance.correlation(X[0], X[2])        # c_02 = 2.0

如果scipy为相同的输入返回
0.0
,我不明白sklearn
2.22044605e-16
值来自何处

# Scipy
import scipy
scipy.spatial.distance.correlation([1,2], [1,2])
>>> 0.0

# Sklearn
pairwise_distances([[1,2], [1,2]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>        [2.22044605e-16, 0.00000000e+00]])
这可能是一个错误

产出:

2.220446049250313e-16                                    # This value is machine dependent

您可以使用将非常小的值舍入为0。

成对距离
y
None
时,内部调用
distance.pdist()
(这意味着我们要计算X中每个向量的距离矩阵)

参考

实施将类似于以下内容:

X = np.array([[1,2], [1,2]])

import numpy as np
from numpy.linalg import norm

X2 = X - X.mean(axis=1, keepdims=True)

u, v =[*X2]

1 - (sum(u*v)/(norm(u) * norm(v)))

#2.220446049250313e-16
但是在最新版本中,scipy.space.distance.correlation的实现有所不同

,

如果我们将权重设置为“无”,则以下代码段就是它的简化版本:

u, v = np.array([1,2]), np.array([1,2])

umu = np.average(u)
vmu = np.average(v)
u = u - umu
v = v - vmu
uv = np.average(u * v)
uu = np.average(np.square(u))
vv = np.average(np.square(v))
dist = 1.0 - uv / np.sqrt(uu * vv)
dist

#0

我完全理解这种困惑

相关性是在向量上计算的,sklearn将标量转换为大小为1的向量

结果

from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import correlation
pairwise_distances([u,v,w], metric='correlation')
是形状
(len([u,v,w]),len([u,v,w])=(3,3)
的矩阵
M
,其中:

M[0,0] = correlation(u,u)
M[0,1] = correlation(u,v)
M[0,2] = correlation(u,w)
M[1,0] = correlation(v,u)
M[1,1] = correlation(v,v)
M[1,2] = correlation(v,w)
M[2,0] = correlation(w,u)
M[2,1] = correlation(w,v)
M[2,2] = correlation(w,w)

您正在查看的
相关性([u,v,w],[u,v,w])
只有当
u
v
w
是标量时才具有有效值。

谢谢。我添加了一部分关于尝试
scipy.space.distance.correlation()
。与sklearn得到的值不同,所以我仍然认为我遗漏了一些重要的东西。正如其他人所说的,2.22e-16在所有密集用途中都是0,因为python中的浮点并不比这更精确。