2015-02-02 22 views
7

Có thể thực hiện tương quan chéo/tự động tương quan trên mảng 1D với chức năng numpy/scipy/matplotlib không? Tôi đã nhìn vào numpy.correlate() và matplotlib.pyplot.xcorr (dựa trên hàm numpy), và cả hai dường như không thể làm tương quan chéo tròn.python tương quan chéo tròn

Để minh họa sự khác biệt, tôi sẽ sử dụng ví dụ về một mảng [1, 2, 3, 4]. Với sự tương quan tròn, một giả định định kỳ được thực hiện, và độ trễ 1 trông giống như [2, 3, 4, 1]. Hàm python mà tôi đã tìm thấy dường như chỉ sử dụng vùng đệm 0, nghĩa là [2, 3, 4, 0]. Có cách nào để có được những chức năng này để làm tương quan vòng tròn? Nếu không, có cách giải quyết chuẩn cho các mối tương quan tròn không?

Trả lời

8

Bạn có thể thực hiện định kỳ (aka tròn) tương quan chéo bằng FFT:

from numpy.fft import fft, ifft 

def periodic_corr(x, y): 
    """Periodic correlation, implemented using the FFT. 

    x and y must be real sequences with the same length. 
    """ 
    return ifft(fft(x) * fft(y).conj()).real 

Bạn cũng có thể thực hiện nó bằng cách sử np.correlate, nếu bạn không nhớ các chi phí phát sinh do np.hstack((y[1:], y)):

import numpy as np 

def periodic_corr_np(x, y): 
    """Periodic correlation, implemented using np.correlate. 

    x and y must be real sequences with the same length. 
    """ 
    return np.correlate(x, np.hstack((y[1:], y)), mode='valid') 
+0

Phiên bản fft không chỉ cho bạn giá cao của hstack, nó cũng làm cho phép tính trong n * log (n) phức tạp như trái ngược với n^2 trong trường hợp tương quan. –

+0

Theo [1] và một số [nguồn khác] (http://mathworld.wolfram.com/Cross-Correlation.html) thuật ngữ đầu tiên nên được liên hợp: 'ifft (fft (x) .conj() * fft (y)). real' [1] Papoulis, A. Fourier Integral và các ứng dụng của nó. New York: McGraw-Hill, trang 244-245 và 252-253, 1962. [Liên kết Sách của Google] (https://books.google.de/books?id=txMIAQAAIAAJ) –

2
from numpy import roll, correlate 
x = [1,2,3,4] 
roll(x, 1) #[4,1,2,3] 
roll(x, 2) #[3,4,1,2] 
roll(x, 3) #[2,3,4,1] 

Để tương quan x với x được dịch chuyển theo k theo k, bạn có thể làm

k = 2 
correlate(x, roll(x,k)) 
Các vấn đề liên quan