#matlab #octave #autocorrelation
#matlab #октава #автокорреляция
Вопрос:
Я генерирую временной ряд из нормального распределения, а затем пытаюсь построить автокорреляцию, используя следующий фрагмент кода:
ts1 = normrnd(0,0.25,1,100);
autocorrelation_ts1 = xcorr(ts1);
Я ожидал, что автокорреляция покажет 1 для x = 0 и почти 0 для остальных значений, вместо этого я получаю значение 6 в положении оси 100.
Я думаю, что вопрос относится как к Matlab, так и к Octave, но я не уверен.
Ответ №1:
Во-первых, ваша вторая строка кода неверна. Я думаю, вы хотели поставить
autocorrelation_ts1 = xcorr(ts1);
Помимо этого, я думаю, что ваше решение правильное. Причина, по которой максимальное значение равно 100, а не 0, заключается в том, что временной сдвиг 0 в автокорреляции фактически происходит на 100-й итерации корреляционной функции. Другими словами, числа на оси X не соответствуют времени.
Чтобы получить время по оси X, измените свой код на
[autocorrelation_ts1, shifts] = xcorr(ts1);
Затем
plot(shifts, autocorrelation_ts1)
Что касается максимального значения, документация matlab для xcorr
указывает, что 1 не является максимальным выходным значением функции при вызове без аргумента нормализации. Если вы хотите нормализовать так, чтобы все значения были равны 1 или меньше, используйте
[autocorrelation_ts1, shifts] = xcorr(ts1, 'normalized');
Комментарии:
1. Вторая строка была опечаткой копирования и вставки. Я попытался использовать сдвиги, и теперь автокорреляция сосредоточена вокруг нуля, как вы заявляете. Кажется, что в Octave
xcorr
отсутствует параметр ‘normalized’, хотя, как вы указываете, это способ решить его в Matlab2. Ручная нормализация может работать в octave. Перед построением графика:
autocorrelation_ts1 = autocorrelation_ts1./max(autocorrelation_ts1);
3. Это работает. Теперь мне интересно, почему автокорреляция кажется статистически ниже при больших задержках / сдвигах. Я бы ожидал, что значение 1 равно 0 и одинаково мало в остальные смены
4. С моей стороны это не так. Возможно, попробуйте очистить свои переменные и запустить код заново с нуля. Может быть просто конкретный случайный временной ряд, с которым вы закончили.
Ответ №2:
В качестве дополнительной ссылки на ответ Скотта, это полный фрагмент кода, включая масштабирование диаграммы stem для отображения до 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')