python 0 - 1序列中零之间的相关性

f8rj6qna  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(209)

我有一个0和1的序列,例如,[0,1,0,0,0,1,0]。我想测量序列中零之间的相关性,即,给定一个零,第一个零之后有多可能是另一个零。我想用相关系数来做这件事。但是,如果我在序列中使用numpy.corrcoef(),它返回1.0,这不是真的。任何建议都很感激。下面是一个代码,它可以复制相同的内容:

import numpy as np

    x = np.random.randint(0,2,1000)
    x = x[...,np.newaxis]
    rho = np.corrcoef(x.T)
    print(rho)
bis0qfac

bis0qfac1#

您需要将x与其移位后的自身进行比较:

np.random.seed(0)

x = np.random.randint(0, 2, 1000)

rho = np.corrcoef(x[:-1], x[1:])

输出:

array([[1.        , 0.00292208],  # <- this is the value you want
       [0.00292208, 1.        ]])
如何工作

我们将每个值与下一个值进行比较:

x 
# array([0, 1, 1, 0, 1, ...,  0, 0, 1, 0])

# first to second-to-last value
x[:-1]
# array([0, 1, 1, 0, 1, ...,  0, 0, 1])

# second to last value
x[1:]
# array([1, 1, 0, 1, ...,  0, 0, 1, 0])
0ejtzxu1

0ejtzxu12#

你的问题有点不一致,因为你一方面说你想计算相关系数,另一方面又说你想计算概率。“相关性”的一般概念与概率有关,但皮尔逊相关系数,例如由numpy.corrcoef()计算的,根本不是概率。您在注解中澄清了您希望计算x[i+1]相对于x[i]的相关系数。
它可能看起来像这样:

import numpy as np

# Generate random data
x = np.random.randint(0, 2, 1000)

corr = np.corrcoef(x[:-1], np.roll(x, -1)[:-1])[0][1]
print(corr)

说明:

  • np.roll(x, -1)生成x的副本,其中元素已向左旋转一个位置。因此,每个元素都是x的相应元素的后继元素(在x中)。
  • x的最后一个元素没有后继元素,因此我们需要忽略它,以及x的旋转版本的相应元素。使用[:-1]进行切片可以实现这一点。
  • 得到的Numpy阵列适合于通过np.corrcoef()的相关计算。结果是提供每个变量与每个其他变量的相关系数的对称矩阵。在我们的例子中,只有两个变量,所以这个矩阵是2 x 2。

主对角线上的元素是其中一个变量与自身的相关系数;它们应该相同地为1。非对角元素是一个变量与另一个变量的相关系数,并且这些应该是对称的。我们可以选择任何一个,上面的选择[0][1]
请注意,对于随机数据,例如本示例,互相关应该近似为零。(这是我们的(伪)随机数生成器的质量的度量。

niknxzdl

niknxzdl3#

你的要求不难计算。我想你是想知道0后面跟着另一个0的概率。这段代码可以做到:

import numpy as np

x = np.array([ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 ])
x0 = x[:-1]
x1 = x[1:]

equal = (x0 == x1) & ~x0
zeros = len(x) - sum(x)
coef = sum(equal) / zeros
print(x0)
print(x1)
print(equal)
print(coef)

输出:

[0 0 0 1 0 0 0 1 0 0 0 1 0 0 0]
[0 0 1 0 0 0 1 0 0 0 1 0 0 0 1]
[1 1 0 0 1 1 0 0 1 1 0 0 1 1 0]
0.6666666666666666

所以,2/3的零后面跟着另一个零,这是正确的。
我在这里做的是计算两个序列的异或,如果值相同,异或为1。然后我用原始序列与之进行NAND运算,只在有两个0的地方留下1。通过将该列表的总和除以原始列表中0的数量,我们得到答案。

相关问题