sklearn 的 pairwise_distances with metric='correlation' 有什么作用?

数据挖掘 Python scikit-学习 距离 scipy
2022-03-10 22:34:37

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

然后我尝试挖掘函数本身,但它令人困惑,因为它可以进行许多不同的计算。

文档

根据文档:

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 计算相关距离

2.22044605e-16如果 scipy 返回0.0相同的输入,我不明白 sklearn值的来源。

# 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]])

我不是在寻找高级别的解释,而是如何计算数字的示例。

1个回答
Y = pdist(X, 'correlation')

计算向量 u 和 v 之间的相关距离。这是

1(uu¯)˙(vv¯)||uu¯||2||vv¯||2

在哪里u¯是向量元素的均值u, 和x˙y是的点积xy.

任何只有两个条目的向量之间的相关性始终为 0(或几乎为零:21016), 为什么?因为相关距离将距离测量为数据之间的线性度。

当我有 [1,2] 和 [1,2] 时,等式y=x非常适合,当我有 [1,2] 和 [1,3] 等式时y=x+1也非常适合。相关距离表示是否可以为数据绘制方程,在这两种情况下,方程都是完美的。

如果您想尝试获得不同的结果,请尝试放置三个元素的 2 个向量,您会看到变化。

试试:[[1,2],[2,3],[3,4]] 和 [[1,4],[3,8],[-5,6]]。但首先,绘制它们,您将理解什么是“相关”度量。