Tôi có hai mảng 1D và tôi muốn xem mối quan hệ giữa chúng. Tôi nên sử dụng quy trình nào khi sử dụng numpy? Tôi đang sử dụng numpy.corrcoef(arrayA, arrayB)
và numpy.correlate(arrayA, arrayB)
và cả hai đều đưa ra một số kết quả mà tôi không thể hiểu hoặc hiểu được. Ai đó có thể làm sáng tỏ làm thế nào để hiểu và giải thích những kết quả số (tốt nhất là sử dụng một ví dụ)? Cảm ơn.cách diễn giải giá trị numpy.correlate và numpy.corrcoef?
Trả lời
numpy.correlate
chỉ trả về sự tương quan chéo của hai vectơ.
nếu bạn cần hiểu mối tương quan chéo, sau đó bắt đầu với http://en.wikipedia.org/wiki/Cross-correlation.
Một ví dụ điển hình có thể được nhìn thấy bằng cách nhìn vào chức năng tự tương quan (một vector chéo tương quan với chính nó):
import numpy as np
# create a vector
vector = np.random.normal(0,1,size=1000)
# insert a signal into vector
vector[::50]+=10
# perform cross-correlation for all data points
output = np.correlate(vector,vector,mode='full')
này sẽ trả về hàm lược/shah với tối đa khi cả hai tập dữ liệu đều chồng chéo nhau. Vì đây là sự tự tương quan, sẽ không có "độ trễ" giữa hai tín hiệu đầu vào. Do đó, tối đa tương quan là vector.size-1.
nếu bạn chỉ muốn giá trị của mối tương quan cho dữ liệu chồng chéo, bạn có thể sử dụng mode='valid'
.
Tôi chỉ có thể nhận xét trên numpy.correlate
vào lúc này. Đó là một công cụ mạnh mẽ. Tôi đã sử dụng nó cho hai mục đích. Đầu tiên là để tìm một mô hình trong mô hình khác:
import numpy as np
import matplotlib.pyplot as plt
some_data = np.random.uniform(0,1,size=100)
subset = some_data[42:50]
mean = np.mean(some_data)
some_data_normalised = some_data - mean
subset_normalised = subset - mean
correlated = np.correlate(some_data_normalised, subset_normalised)
max_index = np.argmax(correlated) # 42 !
Việc sử dụng thứ hai tôi đã sử dụng nó (và làm thế nào để giải thích kết quả) là để phát hiện tần số:
hz_a = np.cos(np.linspace(0,np.pi*6,100))
hz_b = np.cos(np.linspace(0,np.pi*4,100))
f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(hz_a)
axarr[0].plot(hz_b)
axarr[0].grid(True)
hz_a_autocorrelation = np.correlate(hz_a,hz_a,'same')[round(len(hz_a)/2):]
hz_b_autocorrelation = np.correlate(hz_b,hz_b,'same')[round(len(hz_b)/2):]
axarr[1].plot(hz_a_autocorrelation)
axarr[1].plot(hz_b_autocorrelation)
axarr[1].grid(True)
plt.show()
Tìm chỉ số của các đỉnh thứ hai. Từ đó bạn có thể làm việc trở lại để tìm tần số.
first_min_index = np.argmin(hz_a_autocorrelation)
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:])
frequency = 1/second_max_index
nó cũ, nhưng bởi vì tôi có cùng một câu hỏi, tôi không thể hiểu làm thế nào tôi đi đến kết luận. Tôi có hay không có tự tương quan trên báo cáo? Làm thế nào để dịch đầu ra? – hephestos