2014-12-18 5 views
9

मैं अजगर के साथ autocorrelation की साजिश कर रहा हूँ। मैंने इसे करने के तीन तरीकों का उपयोग किया: 1. पांडा, 2. matplotlib, 3. आँकड़े मॉडल। मैंने पाया कि मैं matplotlib से प्राप्त ग्राफ अन्य दो के साथ संगत नहीं है। कोड है:matplotlib के plt.acorr में autocorrelation साजिश की बग?

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') 

ग्राफ यहाँ है: http://quant365.com/viewtopic.php?f=4&t=33

+1

यह सवाल विषय से हटकर प्रतीत होता है, क्योंकि यह एक बग रिपोर्ट –

+2

है इतना ही नहीं करते बग रिपोर्ट इतने पर संबंधित नहीं है, लेकिन अपने उदाहरण रन करने योग्य नहीं है ('mydata' अपरिभाषित है और आयात गुम हैं) और आपके ग्राफ़ पासवर्ड सुरक्षित हैं। सुनिश्चित नहीं है कि आप किस तरह के प्रतिक्रिया की उम्मीद करते हैं। यदि आप इस प्रश्न को बेहतर बनाना चाहते हैं, तो मैं यह पूछने पर ध्यान केंद्रित करने की सलाह देता हूं कि प्रत्येक विशेष कार्य वास्तव में क्या कर रहा है। एक मौका है कि matplotlib एक अलग, लेकिन समान रूप से मान्य दृष्टिकोण ले रहा है। –

+0

यह अभी ठीक होना चाहिए। मैं ग्राफ को यहां नहीं डाल सकता क्योंकि छवि http://quant365.com/download/file.php?id=5 की तरह है, जिसे यहां पोस्ट नहीं किया जा सकता है। –

उत्तर

31

यह आंकड़े और सिग्नल प्रोसेसिंग के बीच अलग अलग आम परिभाषाओं का परिणाम है। असल में, सिग्नल प्रोसेसिंग परिभाषा मानती है कि आप विचलन को संभालने जा रहे हैं। सांख्यिकीय परिभाषा मानती है कि मतलब घटाना आपके द्वारा किए जाने वाले सभी विचलन है, और यह आपके लिए करता है।

सबसे पहले, के एक स्टैंड-अलोन उदाहरण के साथ समस्या यह प्रदर्शित करते हैं:

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

तो, क्यों बिल्ली मैं कह रहा हूँ कि वे सब सही कर रहे हैं? वे स्पष्ट रूप से अलग हैं!

के प्रदर्शन करने के लिए क्या कर रही है plt.acorr हमारे अपने autocorrelation समारोह लिखते हैं:

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) 

यदि हम अपने डेटा के साथ इस साजिश, हम plt.acorr के लिए एक अधिक या कम समान परिणाम प्राप्त करेंगे (मैं कर रहा हूँ बाहर छोड़ने के ठीक से अंतराल लेबलिंग, बस क्योंकि मैं आलसी हूँ):

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

enter image description here

यह एक पूरी तरह से वैल है आईडी autocorrelation। यह सब बात है कि आपकी पृष्ठभूमि सिग्नल प्रोसेसिंग या आंकड़े है या नहीं।

यह सिग्नल प्रोसेसिंग में उपयोग की जाने वाली परिभाषा है। धारणा यह है कि आप अपने डेटा को खराब करने के लिए जा रहे हैं (kwarg plt.acorr में नोट करें)। यदि आप इसे अस्वीकार करना चाहते हैं, तो आप इसकी खोज करेंगे (और संभवतः केवल माध्य को घटाने से बेहतर कुछ करें), और अन्यथा इसे ग्रहण नहीं किया जाना चाहिए।

आंकड़ों में, केवल माध्य को घटाकर माना जाता है कि आप डर्रेंडिंग के लिए क्या करना चाहते थे।

अन्य कार्यों के सभी सह-संबंध है, इस के लिए इसी तरह से पहले डेटा का मतलब घटाकर कर रहे हैं:

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

हालांकि, हम अभी भी एक बड़ा अंतर है। यह पूरी तरह से एक साजिश सम्मेलन है।

अधिकांश सिग्नल प्रोसेसिंग पाठ्यपुस्तकों (जो मैंने देखा है, वैसे भी) में, "पूर्ण" ऑटोकोरिलेशन प्रदर्शित होता है, जैसे शून्य अंतराल केंद्र में होता है, और परिणाम प्रत्येक तरफ सममित होता है। दूसरी तरफ, आर के पास केवल एक तरफ प्रदर्शित करने के लिए बहुत ही उचित सम्मेलन है। (आखिरकार, दूसरी तरफ पूरी तरह से अनावश्यक है।) सांख्यिकीय साजिश कार्य आर रूपांतरण का पालन करते हैं, और plt.acorr मैटलैब क्या करता है, जो विपरीत सम्मेलन है।

मूल रूप से, आप इस चाहते हैं:

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

धन्यवाद मेरे पास अभी भी एक बात बहुत स्पष्ट नहीं है। "हालांकि, हमारे पास अभी भी एक बड़ा अंतर है। यह पूरी तरह से एक साजिश सम्मेलन है।" क्या मुझे पता चलेगा कि साजिश का आयोजन क्या है? मैं आंकड़े पृष्ठभूमि से हूं और सिग्नल प्रोसेसिंग के बारे में कोई जानकारी नहीं है। क्यों पाइथन एक समान संस्करण प्रदान नहीं करते? और मैंने पाया कि पांडा में कोई आंशिक स्वायत्तता नहीं है, जो निराशाजनक है। –

+0

मेरे ग्राफ में क्यों अंतराल पर अंतराल 0 है 0.5? यह गलत है क्योंकि यह 1 होना चाहिए! लेकिन मुझे लगता है कि मैंने सही ढंग से फ़ंक्शन का उपयोग किया था। या मुझे कुछ याद आया? –

+0

@ वूफुएंग - साजिश सम्मेलन पिछले दो आंकड़ों के बीच अंतर है: पूर्ण, सममित ऑटोकॉर्पोरेशन दिखाया गया है या नहीं, या इसका केवल एक आधा हिस्सा है। जहां तक ​​आपके आलेखों का अंतराल 0 पर 0.5 है, मुझे कोई जानकारी नहीं है। मुझे सटीक समान कार्यों के साथ 1 0 पर एक autocorrelation मिलता है। –

संबंधित मुद्दे