Đâ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()
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()
Đâ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()
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()
Câu hỏi này dường như là off-topic vì nó là một báo cáo lỗi –
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ý. –
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. –