Python/Numpy/Pandas实现MATLAB movvar(A,k,w)函数的等效方案
Python/Pandas生态下MATLAB
movvar函数等效实现方案 你之前测试结果不一致的核心原因是误用了移动均值接口pandas.rolling.mean()计算方差,同时Pandas滚动窗口默认参数和MATLAB movvar默认逻辑不匹配,按以下方案调整即可完全对齐输出。
正确实现代码
import pandas as pd A = [4, 8, 6, -1, -2, -3, -1, 3, 4, 5] a = pd.Series(A) # 完全匹配 movvar(A, k=3, w=1) 输出 movvar_result = a.rolling(window=3, center=True, min_periods=1).var(ddof=0) print(movvar_result.round(4))
运行输出:
0 4.0000 1 2.6667 2 14.8889 3 12.6667 4 0.6667 5 0.6667 6 6.2222 7 4.6667 8 0.6667 9 0.2500 dtype: float64
和你给出的MATLAB侧结果完全一致。
参数对齐说明
- 窗口对齐规则:MATLAB
movvar默认使用中心窗口(当前点位于滑动窗口中间),对应Pandas参数center=True,Pandas默认使用右对齐窗口,必须手动调整 - 边缘计算规则:MATLAB边缘位置会自动缩短窗口长度计算结果,对应Pandas参数
min_periods=1,避免边缘位置返回NaN - 方差归一化规则:你测试用的
w=1对应总体方差计算(除数为有效样本数n),对应var(ddof=0);如果MATLAB侧使用无偏方差(除数为n-1),调整为ddof=1即可
如果需要Numpy原生实现,可以使用numpy.lib.stride_tricks.sliding_window_view构造滑动窗口后自行计算方差,逻辑和上述Pandas实现一致,Pandas方案是当前生态下最简便的实现方式。
内容的提问来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

