为了测试我对先锋和珠光体的理解,我比较了两种计算先锋的方法,结果应该是相同的。令人惊讶的是,结果是不同的。
import torch
from scipy.stats import pearsonr, spearmanr
x = torch.normal(1, 1, (10,))
y = torch.normal(1, 1, (10,))
_, x_rank = x.sort()
_, y_rank = y.sort()
print(
spearmanr(x, y),
pearsonr(x_rank, y_rank)
)
若要复制结果,请使用以下x
和y
。这应该是0.263
级和0.139
级的珠光体。
x = torch.tensor([ 1.7443, -0.7889, 0.4698, 1.2080, 0.8847, -0.4490, 1.2561, 1.5188,
-1.0031, 1.4753])
y = torch.tensor([ 1.2675, 1.8317, 1.6912, -0.2964, 2.0014, 1.1092, 2.7958, 2.6034,
-0.0528, -2.2956])
他们为什么不一样?难道先锋不被定义为x
级和y
级以上的珠光体吗?我错过了什么吗?
发布于 2022-05-26 23:49:25
首先,为了澄清起见,皮尔逊和斯皮尔曼的相关性是不一样的,但是它们可以是相等的。在完全线性关系的情况下。前者是线性关系的测度,后者是单调关系的测度。
其次,在排序之前,https://pytorch.org/docs/stable/generated/torch.sort.html#torch.sort不提供排序,而是提供原始数据的索引。您需要的是排序后的原始数据的索引,但按原始数据的顺序,即排名。
你可以这样做:
import torch
from scipy.stats import pearsonr, spearmanr
x = torch.tensor([ 1.7443, -0.7889, 0.4698, 1.2080, 0.8847, -0.4490, 1.2561, 1.5188,
-1.0031, 1.4753])
y = torch.tensor([ 1.2675, 1.8317, 1.6912, -0.2964, 2.0014, 1.1092, 2.7958, 2.6034,
-0.0528, -2.2956])
x_sorted, x_raw_indx = x.sort()
y_sorted, x_raw_indx = y.sort()
x_ranked = [int((x_sorted == value).nonzero(as_tuple=True)[0]) for value in x]
y_ranked = [int((y_sorted == value).nonzero(as_tuple=True)[0]) for value in y]
spearmanr(x, y) , pearsonr(x_ranked, y_ranked)
#(SpearmanrResult(correlation=0.13939393939393938, pvalue=0.7009318849100584),
# (0.1393939393939394, 0.7009318849100588))
正如评论(@simon)中提到的那样,获得排名的一种更清洁的方法是:
x_ranked = x.argsort().argsort()
y_ranked = y.argsort().argsort()
https://stackoverflow.com/questions/72397098
复制相似问题