2014-12-18 12 views
9

Tôi đang âm mưu tự tương quan với python. Tôi đã sử dụng ba cách để làm điều đó: 1. gấu trúc, 2. matplotlib, 3. statsmodels. Tôi thấy đồ thị tôi nhận được từ matplotlib không nhất quán với hai loại kia. Mã này là:lỗi của âm mưu tự tương quan trong plt.acorr của matplotlib?

from statsmodels.graphics.tsaplots import * 
# print out data 
print mydata.values 

#1. pandas 
p=autocorrelation_plot(mydata) 
plt.title('mydata') 

#2. matplotlib 
fig=plt.figure() 
plt.acorr(mydata,maxlags=150) 
plt.title('mydata') 

#3. statsmodels.graphics.tsaplots.plot_acf 
plot_acf(mydata) 
plt.title('mydata') 

Đồ thị là ở đây: http://quant365.com/viewtopic.php?f=4&t=33

+1

Câu hỏi này dường như là off-topic vì nó là một báo cáo lỗi –

+2

không chỉ báo cáo lỗi không thuộc về SO, nhưng bạn ví dụ không thể chạy được ('mydata' không xác định và nhập bị thiếu) và biểu đồ của bạn được bảo vệ bằng mật khẩu. Bạn không chắc chắn loại phản hồi nào bạn mong đợi. Nếu bạn muốn cải thiện câu hỏi này, tôi khuyên bạn nên tập trung vào việc hỏi mỗi chức năng cụ thể thực sự đang làm gì. Có một cơ hội mà matplotlib đang thực hiện một cách tiếp cận khác, nhưng không kém phần hợp lý. –

+0

Nó sẽ ổn thôi. Tôi không thể đặt đồ thị ở đây vì hình ảnh giống như http://quant365.com/download/file.php?id=5, không thể đăng ở đây. –

Trả lời

31

Đây là một kết quả của các định nghĩa thông thường khác nhau giữa thống kê và xử lý tín hiệu. Về cơ bản, định nghĩa xử lý tín hiệu giả định rằng bạn sẽ xử lý việc giảm dần. Định nghĩa thống kê giả định rằng trừ đi giá trị trung bình là tất cả những gì bạn sẽ làm, và thực hiện nó cho bạn.

Trước hết, chúng ta hãy chứng minh vấn đề với một ví dụ độc lập:

import numpy as np 
import matplotlib.pyplot as plt 

import pandas as pd 
from statsmodels.graphics import tsaplots 

def label(ax, string): 
    ax.annotate(string, (1, 1), xytext=(-8, -8), ha='right', va='top', 
       size=14, xycoords='axes fraction', textcoords='offset points') 

np.random.seed(1977) 
data = np.random.normal(0, 1, 100).cumsum() 

fig, axes = plt.subplots(nrows=4, figsize=(8, 12)) 
fig.tight_layout() 

axes[0].plot(data) 
label(axes[0], 'Raw Data') 

axes[1].acorr(data, maxlags=data.size-1) 
label(axes[1], 'Matplotlib Autocorrelation') 

tsaplots.plot_acf(data, axes[2]) 
label(axes[2], 'Statsmodels Autocorrelation') 

pd.tools.plotting.autocorrelation_plot(data, ax=axes[3]) 
label(axes[3], 'Pandas Autocorrelation') 

# Remove some of the titles and labels that were automatically added 
for ax in axes.flat: 
    ax.set(title='', xlabel='') 
plt.show() 

enter image description here

Vì vậy, tại sao các heck tôi nói rằng tất cả họ đều có đúng không? Họ rõ ràng là khác nhau!

Hãy viết hàm tự tương quan của chúng ta để chứng minh những gì plt.acorr được thực hiện:

def acorr(x, ax=None): 
    if ax is None: 
     ax = plt.gca() 
    autocorr = np.correlate(x, x, mode='full') 
    autocorr /= autocorr.max() 

    return ax.stem(autocorr) 

Nếu chúng ta vẽ này với dữ liệu của chúng tôi, chúng tôi sẽ nhận được một kết quả nhiều hay ít giống với plt.acorr (Tôi rời ra ghi nhãn đúng độ trễ, đơn giản chỉ vì tôi là lười biếng):

fig, ax = plt.subplots() 
acorr(data) 
plt.show() 

enter image description here

Đây là một cách hoàn hảo val tự tương quan id. Tất cả vấn đề là liệu nền của bạn có đang xử lý tín hiệu hay thống kê hay không.

Đây là định nghĩa được sử dụng trong xử lý tín hiệu. Giả định là bạn sẽ xử lý việc xóa dữ liệu của mình (lưu ý detrend kwarg trong plt.acorr). Nếu bạn muốn nó bị xua tan, bạn sẽ yêu cầu nó (và có thể làm điều gì đó tốt hơn là trừ đi giá trị trung bình), và nếu không nó sẽ không được giả định.

Trong thống kê, chỉ cần trừ trung bình được giả định là những gì bạn muốn làm để giảm dần.

Tất cả các chức năng khác được trừ giá trị trung bình của dữ liệu trước khi tương quan, tương tự như sau:

def acorr(x, ax=None): 
    if ax is None: 
     ax = plt.gca() 

    x = x - x.mean() 

    autocorr = np.correlate(x, x, mode='full') 
    autocorr /= autocorr.max() 

    return ax.stem(autocorr) 

fig, ax = plt.subplots() 
acorr(data) 
plt.show() 

enter image description here

Tuy nhiên, chúng tôi vẫn có một sự khác biệt lớn. Điều này hoàn toàn là một quy ước âm mưu.

Trong hầu hết các sách giáo khoa xử lý tín hiệu (dù sao tôi đã thấy), tự tương quan "đầy đủ" được hiển thị, sao cho độ trễ bằng không ở giữa và kết quả là đối xứng ở mỗi bên. R, mặt khác, có quy ước rất hợp lý để chỉ hiển thị một mặt của nó. (Sau khi tất cả, phía bên kia là hoàn toàn dư thừa.) Các chức năng âm mưu thống kê theo quy ước R, và plt.acorr theo những gì Matlab làm, đó là quy ước đối diện.

Về cơ bản, bạn sẽ muốn điều này:

def acorr(x, ax=None): 
    if ax is None: 
     ax = plt.gca() 

    x = x - x.mean() 

    autocorr = np.correlate(x, x, mode='full') 
    autocorr = autocorr[x.size:] 
    autocorr /= autocorr.max() 

    return ax.stem(autocorr) 

fig, ax = plt.subplots() 
acorr(data) 
plt.show() 

enter image description here

+1

Cảm ơn tôi vẫn có một điều không rõ ràng. "Tuy nhiên, chúng tôi vẫn có một sự khác biệt lớn. Điều này hoàn toàn là một quy ước âm mưu." Tôi có thể biết quy ước âm mưu là gì không? Tôi từ nền thống kê và không có kiến ​​thức về xử lý tín hiệu. Tại sao python không cung cấp một phiên bản thống nhất? Và tôi chỉ thấy không có sự tự tương quan một phần trong gấu trúc, điều này thật đáng thất vọng. –

+0

Tại sao trong biểu đồ của tôi, tự tương quan tại độ trễ 0 là 0,5? Điều này là sai vì nó phải là 1! Nhưng tôi nghĩ tôi đã sử dụng đúng chức năng. Hoặc tôi đã bỏ lỡ bất cứ điều gì? –

+0

@WuFuheng - Quy ước âm mưu là sự khác biệt giữa hai số liệu cuối cùng: có hay không toàn bộ, tương quan tự tương quan được hiển thị, hoặc chỉ một nửa của nó. Theo như lý do tại sao đồ thị của bạn có 0,5 ở độ trễ 0, tôi không có ý tưởng. Tôi nhận được một autocorrelation của 1 tại lag 0 với các chức năng chính xác tương tự. –

Các vấn đề liên quan