为何不同Python库自相关计算结果有差异?哪个结果正确?
关于不同Python库计算自相关的差异疑问
问题
- 为何使用不同Python库计算自相关会得到不同结果?
- 哪个结果是正确的?
Scipy实现代码及输出
import numpy as np from scipy import signal # 给定数据 data = np.array([1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 3.33]) # 使用scipy的correlate函数计算自相关 autocorrelations = signal.correlate(data, data, mode='full') # 自相关数组的中间位置索引为len(data)-1 mid_index = len(data) - 1 # 展示滞后lag=1,2,3,4,...的自相关值 print(autocorrelations[mid_index + 1:])
输出:
[21.2425 17.285 13.4525 9.8075 6.4125 3.33 ]
Pandas实现代码及输出
import pandas as pd # 给定数据 data = [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 3.33] # 将数据转换为pandas Series series = pd.Series(data) # 计算并输出滞后lag=1到数据长度-1的自相关值 for lag in range(0, len(data)): print(series.autocorr(lag=lag))
输出:
1.0 0.9374115462038415 0.9287843240596312 0.9260849979667674 0.9407970411588671 0.9999999999999999
Statsmodels实现代码及输出
from statsmodels.tsa.stattools import acf # 给定数据 data = [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 3.33] # 使用acf函数计算自相关 autocorrelation = acf(data, nlags=len(data)-1, fft=True) # 展示滞后lag=1,2,3,4,...的自相关系数 print(autocorrelation)
输出:
[ 1. 0.39072553 0.13718689 -0.08148897 -0.24787067 -0.3445268 -0.35402598]
问题解答
1. 结果差异的原因
三个库的计算逻辑本质是自相关的不同定义和标准化方式导致的:
- Scipy的
signal.correlate:计算的是原始的互相关(自相关是互相关的特例),没有做任何标准化,结果是原始数据的交叉乘积和,数值会随数据尺度变化。 - Pandas的
Series.autocorr:计算的是皮尔逊相关系数,用滞后k的协方差除以数据的总体方差,但当lag接近数据长度时,可用样本量极少,会导致结果异常接近1。 - Statsmodels的
acf:计算的是时间序列分析中标准的样本自相关系数(ACF),先对数据去均值,再计算滞后k的协方差除以样本方差,还会做自由度校正,结果是标准化后的值,范围在[-1,1]之间。
2. 哪个结果正确?
没有绝对的“正确”,取决于使用场景:
- 若需要原始交叉乘积和(比如信号处理场景),Scipy的结果适用;
- 若需要基于皮尔逊相关的自相关,且能接受小样本lag的异常结果,Pandas的结果可用;
- 若做时间序列分析,Statsmodels的ACF结果是统计学上最严谨、行业通用的标准计算方式。
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

