我想计算3个数组X1,X2和Y的自协方差,它们都是平稳的随机过程。 sciPy或其他库中是否有任何函数可以解决这个问题?如何计算Python中的自协方差
9
A
回答
3
4
根据自协方差系数为离散信号的标准估计,这可以由等式表示:
...其中x(i)
是一个给定的信号(即特定1D向量),k
代表x(i)
信号由k
样本移位,N
是x(i)
信号的长度,并且:
...这是简单的平均,我们可以这样写:
'''
Calculate the autocovarriance coefficient.
'''
import numpy as np
Xi = np.array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5])
N = np.size(Xi)
k = 5
Xs = np.average(Xi)
def autocovariance(Xi, N, k, Xs):
autoCov = 0
for i in np.arange(0, N-k):
autoCov += ((Xi[i+k])-Xs)*(Xi[i]-Xs)
return (1/(N-1))*autoCov
print("Autocovariance:", autocovariance(Xi, N, k, Xs))
如果你想标准化自协方差系数,这将成为自相关系数表示为:
...比你只需要添加到上面的代码只是两个额外的线路:
def autocorrelation():
return autocovariance(Xi, N, k, Xs)/autocovariance(Xi, N, 0, Xs)
这里完整的脚本:
'''
Calculate the autocovarriance and autocorrelation coefficients.
'''
import numpy as np
Xi = np.array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5])
N = np.size(Xi)
k = 5
Xs = np.average(Xi)
def autocovariance(Xi, N, k, Xs):
autoCov = 0
for i in np.arange(0, N-k):
autoCov += ((Xi[i+k])-Xs)*(Xi[i]-Xs)
return (1/(N-1))*autoCov
def autocorrelation():
return autocovariance(Xi, N, k, Xs)/autocovariance(Xi, N, 0, Xs)
print("Autocovariance:", autocovariance(Xi, N, k, Xs))
print("Autocorrelation:", autocorrelation())
1
获取样本自协方差:
# cov_auto_samp(X,delta)/cov_auto_samp(X,0) = auto correlation
def cov_auto_samp(X,delta):
N = len(X)
Xs = np.average(X)
autoCov = 0.0
times = 0.0
for i in np.arange(0, N-delta):
autoCov += (X[i+delta]-Xs)*(X[i]-Xs)
times +=1
return autoCov/times
0
对以前的答案进行了小小的调整,避免了python for
循环,而是使用numpy数组操作。如果你有很多数据,这会更快。
def lagged_auto_cov(Xi,t):
"""
for series of values x_i, length N, compute empirical auto-cov with lag t
defined: 1/(N-1) * \sum_{i=0}^{N-t} (x_i - x_s) * (x_{i+t} - x_s)
"""
N = len(time_series)
# use sample mean estimate from whole series
Xs = np.mean(Xi)
# construct copies of series shifted relative to each other,
# with mean subtracted from values
end_padded_series = np.zeros(N+t)
end_padded_series[:N] = Xi - Xs
start_padded_series = np.zeros(N+t)
start_padded_series[t:] = Xi - Xs
auto_cov = 1./(N-1) * np.sum(start_padded_series*end_padded_series)
return auto_cov
此针对@bluevoxel的代码,用一个时间序列的50000个数据点,计算用于滞后的单一固定值的自相关相比,蟒for
循环代码平均约为30毫秒和使用numpy阵列的平均速度超过0.3毫秒(运行在我的笔记本电脑上)。
相关问题
- 1. 协方差矩阵计算
- 2. Java中的计算协方差矩阵
- 3. 在Matlab中计算协方差矩阵
- 4. 多元统计协方差计算
- 5. 如何计算张量流中的协方差?
- 6. 使用Excel计算协方差矩阵
- 7. 运行(单程)协方差计算
- 8. 使用VBA计算协方差矩阵
- 9. 计算协方差矩阵式
- 10. 由Python Numpy计算的协方差矩阵每次都改变
- 11. 支持加权协方差计算的Python软件包
- 12. 计算方差和协方差的数据声明
- 13. 如何计算Python中的差分
- 14. 如何计算协方差的导数/梯度?
- 15. 如何计算n维变量之间的协方差
- 16. 我如何计算2幅图像之间的协方差?
- 17. tf.nn.moments如何计算方差?
- 18. Python:如何计算协方差矩阵和导出数据,如地图结构
- 19. 如何计算perl中的方差?
- 20. 如何更有效地计算滚动协方差
- 21. 如何从随机向量计算协方差矩阵?
- 22. 如何从ff_matrix高效地计算协方差矩阵
- 23. 如何用熊猫计算协方差矩阵
- 24. 计算协方差矩阵 - numpy.cov和numpy.dot之间的差异?
- 25. PyMC - 方差 - 协方差矩阵估计
- 26. 计算1000点5×5矩阵的MATLAB中的协方差
- 27. 有效计算图像python的方差
- 28. 计算matlab中两幅图像的协方差
- 29. 行计算相关/协方差矩阵的有效方法
- 30. 如何计算的均方误差
Numpy已经拥有了计算[相关]所需的一切(https://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html)。 (甚至可以使用[scipy.signal.fftconvolve]加速(http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.signal.fftconvolve.html)。)需要乘以[方差](http://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html)以获得自协方差。 – Celelibi