You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何不同Python库自相关计算结果有差异?哪个结果正确?

关于不同Python库计算自相关的差异疑问

问题

  1. 为何使用不同Python库计算自相关会得到不同结果?
  2. 哪个结果是正确的?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:37:21