我想計算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