sklearn 的 pairwise_distances 和 metric='correlation' 有什么作用?
What does sklearn's pairwise_distances with metric='correlation' do?
我在这个函数中输入了不同的值并观察了输出。但是我无法在输出的内容中找到可预测的模式。
然后我尝试深入研究 function 本身,但它令人困惑,因为它可以进行多种不同的计算。
根据Docs:
Compute the distance matrix from a vector array X and optional Y.
我看到它 returns 一个高度和宽度等于输入的嵌套列表数的矩阵,这意味着它正在比较每一个。
但除此之外,我很难理解它的作用以及这些值的来源。
我试过的例子:
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计算相关距离
如果 scipy returns 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]])
我不是在寻找高层次的解释,而是在寻找如何计算数字的示例。
可在此处找到距离指标:
https://docs.scipy.org/doc/scipy/reference/spatial.distance.html
相关性具体在这里:
u和v之间的相关距离,定义为
import sklearn
X = [[1, 2, 3, 4], [2, 2, 4, 4], [4, 3, 2, 1]]
D = sklearn.metrics.pairwise_distances(X, metric='correlation')
print(D)
输出:
[[0. 0.10557281 2. ]
[0.10557281 0. 1.89442719]
[2. 1.89442719 0. ]]
D
是一个距离矩阵使得 D{i, j} 是 i[=给定矩阵的第 35=]th 和 jth 向量 X
.
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
I don't understand where the sklearn 2.22044605e-16
value is coming from if scipy returns 0.0
for the same inputs.
这大概是一个round-off error.
import numpy as np
epsilon = np.finfo(float).eps
print(epsilon)
输出:
2.220446049250313e-16 # This value is machine dependent
您可以使用 np.isclose
将极小的值四舍五入为 0。
pairwise_distances
内部调用 distance.pdist()
,当 y
是 None
(这意味着我们要计算 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.spatial.distance.correlation
最新版本的实现有所不同
如果我们将权重设置为 None,以下代码段是它的简化版本:
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)
您查看的 correlation([u,v,w], [u,v,w])
只有在 u
、v
和 w
是标量时才具有有效值。
我在这个函数中输入了不同的值并观察了输出。但是我无法在输出的内容中找到可预测的模式。
然后我尝试深入研究 function 本身,但它令人困惑,因为它可以进行多种不同的计算。
根据Docs:
Compute the distance matrix from a vector array X and optional Y.
我看到它 returns 一个高度和宽度等于输入的嵌套列表数的矩阵,这意味着它正在比较每一个。
但除此之外,我很难理解它的作用以及这些值的来源。
我试过的例子:
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计算相关距离
如果 scipy returns 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]])
我不是在寻找高层次的解释,而是在寻找如何计算数字的示例。
可在此处找到距离指标: https://docs.scipy.org/doc/scipy/reference/spatial.distance.html
相关性具体在这里:
u和v之间的相关距离,定义为
import sklearn
X = [[1, 2, 3, 4], [2, 2, 4, 4], [4, 3, 2, 1]]
D = sklearn.metrics.pairwise_distances(X, metric='correlation')
print(D)
输出:
[[0. 0.10557281 2. ]
[0.10557281 0. 1.89442719]
[2. 1.89442719 0. ]]
D
是一个距离矩阵使得 D{i, j} 是 i[=给定矩阵的第 35=]th 和 jth 向量 X
.
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
I don't understand where the sklearn
2.22044605e-16
value is coming from if scipy returns0.0
for the same inputs.
这大概是一个round-off error.
import numpy as np
epsilon = np.finfo(float).eps
print(epsilon)
输出:
2.220446049250313e-16 # This value is machine dependent
您可以使用 np.isclose
将极小的值四舍五入为 0。
pairwise_distances
内部调用 distance.pdist()
,当 y
是 None
(这意味着我们要计算 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.spatial.distance.correlation
最新版本的实现有所不同
如果我们将权重设置为 None,以下代码段是它的简化版本:
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)
您查看的 correlation([u,v,w], [u,v,w])
只有在 u
、v
和 w
是标量时才具有有效值。