Укажите отставание в numpy.correlate - PullRequest
4 голосов
/ 21 февраля 2012

Функция взаимной корреляции Matlab xcorr(x,y,maxlags) имеет опцию maxlag, которая возвращает последовательность взаимной корреляции в диапазоне задержки [-maxlags:maxlags]. Numpy's 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 ]

1 голос
/ 28 апреля 2014

Это моя реализация корреляции опережающих опережений, но она ограничена 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
0 голосов
/ 20 декабря 2017

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
0 голосов
/ 21 февраля 2012

Я бы порекомендовал посмотреть этот файл , чтобы определить, как бы вы хотели реализовать корреляцию, описанную здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...