【问题标题】:Calculate the autocorrelation of a time series created from a normal distribution计算从正态分布创建的时间序列的自相关
【发布时间】:2021-01-27 02:32:02
【问题描述】:

我从正态分布生成时间序列,然后尝试使用以下代码 sn-p 绘制自相关:

ts1 = normrnd(0,0.25,1,100);
autocorrelation_ts1 = xcorr(ts1);

我期望自相关在 x=0 时显示为 1,而对于其余值几乎为 0,但我在轴位置 100 处得到值 6。

我认为这个问题适用于 Matlab 和 Octave,但我不确定。

【问题讨论】:

    标签: matlab octave autocorrelation


    【解决方案1】:

    第一件事是你的第二行代码是错误的。我想你的意思是把

    autocorrelation_ts1 = xcorr(ts1);
    

    除此之外,我认为您的解决方案是正确的。最大值为 100 而不是 0 的原因是因为自相关中 0 的时间偏移实际上发生在相关函数的第 100 次迭代中。也就是说,X 轴上的数字与时间不对应。

    要在 X 轴上获取时间,请将代码更改为

    [autocorrelation_ts1, shifts] = xcorr(ts1);
    

    然后

    plot(shifts, autocorrelation_ts1)
    

    关于最大值,matlab documentation for xcorr 表示在没有规范化参数的情况下调用时,1 不是函数的最大输出值。如果要规范化以使所有值都小于或等于 1,请使用

    [autocorrelation_ts1, shifts] = xcorr(ts1, 'normalized');
    

    【讨论】:

    • 第二行是复制粘贴错字。我尝试过使用移位,现在自相关以您所说的零为中心。似乎 Octave 的 xcorr 缺少“标准化”参数,尽管正如您指出的那样,这是在 Matlab 中解决它的方法
    • 手动归一化可能在八度音阶中起作用。绘图前:autocorrelation_ts1 = autocorrelation_ts1./max(autocorrelation_ts1);
    • 那行得通。现在我想知道为什么对于较大的滞后/偏移,自相关似乎在统计上较低。我希望在 0 时为 1,在其余班次中同样小
    • 我的情况并非如此。也许尝试清除您的变量并从头开始重新运行代码。可能只是您最终得到的特定随机时间序列。
    【解决方案2】:

    作为对 Scott 答案的补充参考,这是完整的代码 sn-p,包括干图缩放以显示多达 20 个班次/滞后。

    [auto_ts1, lags] = xcorr(ts1);
    ts_begin = ceil(size(lags,2)/2);
    ts_end = ts_begin + 20;
    stem(lags(ts_begin:ts_end),auto_ts1(ts_begin:ts_end)/max(auto_ts1), 'linewidth', 4.0, 'filled')
    

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多