Укажите отставание в numpy.correlate
Функция взаимной корреляции Matlab xcorr(x,y,maxlags)
имеет возможность maxlag
, который возвращает последовательность взаимной корреляции в диапазоне запаздывания [-maxlags:maxlags]
, Numpy-х numpy.correlate(N,M,mode)
имеет три режима, но ни один из них не позволяет мне установить конкретную задержку, которая отличается от полной (N+M-1)
, так же (max(M, N))
или действительный (max(M, N) - min(M, N) + 1 )
, За len(N) = 60000
, len (M) = 200
Я хочу установить лаг как 100.
3 ответа
matplotlib.xcorr
имеет параметр maxlags. Это на самом деле обертка numpy.correlate
, поэтому нет сохранения производительности. Тем не менее он дает точно такой же результат, который дает функция взаимной корреляции Матлаба. Ниже я отредактировал код из maxplotlib, чтобы он возвращал только корреляцию. Причина в том, что если мы используем matplotlib.corr
как это, он также вернет сюжет. Проблема в том, что, если мы введем в качестве аргументов комплексный тип данных, мы получим предупреждение "приведение комплекса к реальному типу данных", когда matplotlib попытается нарисовать график.
<!-- language: python -->
import numpy as np
import matplotlib.pyplot as plt
def xcorr(x, y, maxlags=10):
Nx = len(x)
if Nx != len(y):
raise ValueError('x and y must be equal length')
c = np.correlate(x, y, mode=2)
if maxlags is None:
maxlags = Nx - 1
if maxlags >= Nx or maxlags < 1:
raise ValueError('maxlags must be None or strictly positive < %d' % Nx)
c = c[Nx - 1 - maxlags:Nx + maxlags]
return c
Это моя реализация корреляции опережающих и отстающих, но она ограничена 1-D и не гарантирует, что она будет лучшей с точки зрения эффективности. Он использует scipy.stats.pearsonr для выполнения основных вычислений, поэтому также возвращается значение p для коэффициента. Пожалуйста, измените, чтобы оптимизировать на основе этого соломенного человека.
def lagcorr(x,y,lag=None,verbose=True):
'''Compute lead-lag correlations between 2 time series.
<x>,<y>: 1-D time series.
<lag>: lag option, could take different forms of <lag>:
if 0 or None, compute ordinary correlation and p-value;
if positive integer, compute lagged correlation with lag
upto <lag>;
if negative integer, compute lead correlation with lead
upto <-lag>;
if pass in an list or tuple or array of integers, compute
lead/lag correlations at different leads/lags.
Note: when talking about lead/lag, uses <y> as a reference.
Therefore positive lag means <x> lags <y> by <lag>, computation is
done by shifting <x> to the left hand side by <lag> with respect to
<y>.
Similarly negative lag means <x> leads <y> by <lag>, computation is
done by shifting <x> to the right hand side by <lag> with respect to
<y>.
Return <result>: a (n*2) array, with 1st column the correlation
coefficients, 2nd column correpsonding p values.
Currently only works for 1-D arrays.
'''
import numpy
from scipy.stats import pearsonr
if len(x)!=len(y):
raise('Input variables of different lengths.')
#--------Unify types of <lag>-------------
if numpy.isscalar(lag):
if abs(lag)>=len(x):
raise('Maximum lag equal or larger than array.')
if lag<0:
lag=-numpy.arange(abs(lag)+1)
elif lag==0:
lag=[0,]
else:
lag=numpy.arange(lag+1)
elif lag is None:
lag=[0,]
else:
lag=numpy.asarray(lag)
#-------Loop over lags---------------------
result=[]
if verbose:
print '\n#<lagcorr>: Computing lagged-correlations at lags:',lag
for ii in lag:
if ii<0:
result.append(pearsonr(x[:ii],y[-ii:]))
elif ii==0:
result.append(pearsonr(x,y))
elif ii>0:
result.append(pearsonr(x[ii:],y[:-ii]))
result=numpy.asarray(result)
return result