gpt4 book ai didi

python - 0-lag 时的标准化 plt.xcorr 和 np.corrcoef 之间的差异

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:43 32 4
gpt4 key购买 nike

我正在研究两个相对较小的时间序列之间的互相关性,但在尝试完成的过程中,我遇到了一个我无法调和的问题。首先,我了解 plt.xcorr 和 np.correlate 之间的依赖关系。但是,我无法协调零延迟时的 plt.xcorrnp.corrcoef 之间的差异?

a = np.array([  7.35846410e+08,   8.96271634e+08,   6.16249222e+08,
8.00739868e+08, 1.06116376e+09, 9.05690167e+08,
6.31383600e+08])
b = np.array([ 1.95621617e+09, 2.06263134e+09, 2.27717015e+09,
2.27281916e+09, 2.71090116e+09, 2.84676385e+09,
3.19578883e+09])

np.corrcoef(a,b)
# returns:
array([[ 1. , 0.02099573],
[ 0.02099573, 1. ]])

plt.xcorr(a,b,normed=True, maxlags=1)
# returns:
array([-1, 0, 1]),
array([ 0.90510941, 0.97024415, 0.79874158])

我预计它们会返回相同的结果。我显然不明白 plt.xcorr 是如何规范的,有人可以帮我纠正一下吗?

最佳答案

标准“ PIL 逊积矩相关系数”的计算是使用按平均值移动的样本。互相关系数不使用归一化样本。除此之外,计算是相似的。但这些系数仍然具有不同的公式和不同的含义。仅当样本 ab 的平均值等于 0 时,它们才相等(如果按平均值移动不会改变样本)。

import numpy as np
import matplotlib.pyplot as plt

a = np.array([7.35846410e+08, 8.96271634e+08, 6.16249222e+08,
8.00739868e+08, 1.06116376e+09, 9.05690167e+08, 6.31383600e+08])
b = np.array([1.95621617e+09, 2.06263134e+09, 2.27717015e+09,
2.27281916e+09, 2.71090116e+09, 2.84676385e+09, 3.19578883e+09])

y = np.corrcoef(a, b)
z = plt.xcorr(a, b, normed=True, maxlags=1)
print("Pearson product-moment correlation coefficient between `a` and `b`:", y[0][1])
print("Cross-correlation coefficient between `a` and `b` with 0-lag:", z[1][1], "\n")


# Calculate manually:

def pearson(a, b):
# Length.
n = len(a)

# Means.
ma = sum(a) / n
mb = sum(b) / n

# Shifted samples.
_ama = a - ma
_bmb = b - mb

# Standard deviations.
sa = np.sqrt(np.dot(_ama, _ama) / n)
sb = np.sqrt(np.dot(_bmb, _bmb) / n)

# Covariation.
cov = np.dot(_ama, _bmb) / n

# Final formula.
# Note: division by `n` in deviations and covariation cancel out each other in
# final formula and could be ignored.
return cov / (sa * sb)

def cross0lag(a, b):
return np.dot(a, b) / np.sqrt(np.dot(a, a) * np.dot(b, b))

pearson_coeff = pearson(a, b)
cross_coeff = cross0lag(a, b)

print("Manually calculated coefficients:")
print(" Pearson =", pearson_coeff)
print(" Cross =", cross_coeff, "\n")


# Normalized samples:
am0 = a - sum(a) / len(a)
bm0 = b - sum(b) / len(b)
pearson_coeff = pearson(am0, bm0)
cross_coeff = cross0lag(am0, bm0)
print("Coefficients for samples with means = 0:")
print(" Pearson =", pearson_coeff)
print(" Cross =", cross_coeff)

输出:

Pearson product-moment correlation coefficient between `a` and `b`: 0.020995727082
Cross-correlation coefficient between `a` and `b` with 0-lag: 0.970244146831

Manually calculated coefficients:
Pearson = 0.020995727082
Cross = 0.970244146831

Coefficients for samples with means = 0:
Pearson = 0.020995727082
Cross = 0.020995727082

关于python - 0-lag 时的标准化 plt.xcorr 和 np.corrcoef 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39628497/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com