यह आंकड़े और सिग्नल प्रोसेसिंग के बीच अलग अलग आम परिभाषाओं का परिणाम है। असल में, सिग्नल प्रोसेसिंग परिभाषा मानती है कि आप विचलन को संभालने जा रहे हैं। सांख्यिकीय परिभाषा मानती है कि मतलब घटाना आपके द्वारा किए जाने वाले सभी विचलन है, और यह आपके लिए करता है।
सबसे पहले, के एक स्टैंड-अलोन उदाहरण के साथ समस्या यह प्रदर्शित करते हैं:
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()
तो, क्यों बिल्ली मैं कह रहा हूँ कि वे सब सही कर रहे हैं? वे स्पष्ट रूप से अलग हैं!
के प्रदर्शन करने के लिए क्या कर रही है 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()
यह एक पूरी तरह से वैल है आईडी 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()
हालांकि, हम अभी भी एक बड़ा अंतर है। यह पूरी तरह से एक साजिश सम्मेलन है।
अधिकांश सिग्नल प्रोसेसिंग पाठ्यपुस्तकों (जो मैंने देखा है, वैसे भी) में, "पूर्ण" ऑटोकोरिलेशन प्रदर्शित होता है, जैसे शून्य अंतराल केंद्र में होता है, और परिणाम प्रत्येक तरफ सममित होता है। दूसरी तरफ, आर के पास केवल एक तरफ प्रदर्शित करने के लिए बहुत ही उचित सम्मेलन है। (आखिरकार, दूसरी तरफ पूरी तरह से अनावश्यक है।) सांख्यिकीय साजिश कार्य आर रूपांतरण का पालन करते हैं, और 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()
यह सवाल विषय से हटकर प्रतीत होता है, क्योंकि यह एक बग रिपोर्ट –
है इतना ही नहीं करते बग रिपोर्ट इतने पर संबंधित नहीं है, लेकिन अपने उदाहरण रन करने योग्य नहीं है ('mydata' अपरिभाषित है और आयात गुम हैं) और आपके ग्राफ़ पासवर्ड सुरक्षित हैं। सुनिश्चित नहीं है कि आप किस तरह के प्रतिक्रिया की उम्मीद करते हैं। यदि आप इस प्रश्न को बेहतर बनाना चाहते हैं, तो मैं यह पूछने पर ध्यान केंद्रित करने की सलाह देता हूं कि प्रत्येक विशेष कार्य वास्तव में क्या कर रहा है। एक मौका है कि matplotlib एक अलग, लेकिन समान रूप से मान्य दृष्टिकोण ले रहा है। –
यह अभी ठीक होना चाहिए। मैं ग्राफ को यहां नहीं डाल सकता क्योंकि छवि http://quant365.com/download/file.php?id=5 की तरह है, जिसे यहां पोस्ट नहीं किया जा सकता है। –