2012-11-18 14 views
18

मेरे पास दो 1 डी सरणी हैं और मैं उनके अंतर-संबंध देखना चाहता हूं। मैं numpy में किस प्रक्रिया का उपयोग करना चाहिए? मैं numpy.corrcoef(arrayA, arrayB) और numpy.correlate(arrayA, arrayB) का उपयोग कर रहा हूं और दोनों कुछ परिणाम दे रहे हैं जिन्हें मैं समझने या समझने में सक्षम नहीं हूं। क्या कोई व्यक्ति उन संख्यात्मक परिणामों को समझने और समझने के तरीके पर प्रकाश डाल सकता है (अधिमानतः एक उदाहरण का उपयोग कर)? धन्यवाद।numpy.correlate और numpy.corrcoef मानों को कैसे समझें?

उत्तर

10

numpy.correlate बस दो वैक्टरों के क्रॉस-सहसंबंध देता है।

यदि आपको क्रॉस-सहसंबंध को समझने की आवश्यकता है, तो http://en.wikipedia.org/wiki/Cross-correlation से शुरू करें।

एक अच्छा उदाहरण है (अपने आप के साथ एक वेक्टर पार सहसंबद्ध) autocorrelation समारोह को देखकर देखा जा सकता है:

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

Code graph

यह एक अधिकतम जब साथ एक कंघी/शाह समारोह वापस आ जाएगी दोनों डेटा सेट ओवरलैपिंग कर रहे हैं। चूंकि यह एक स्वायत्तता है क्योंकि दो इनपुट सिग्नल के बीच कोई "अंतराल" नहीं होगा। इसलिए अधिकतम सहसंबंध vector.size-1 है।

यदि आप केवल ओवरलैपिंग डेटा के लिए सहसंबंध के मूल्य चाहते हैं, तो आप mode='valid' का उपयोग कर सकते हैं।

+1

यह पुराना है, लेकिन क्योंकि मेरे पास एक ही सवाल है, मैं समझ नहीं पा रहा हूं कि मैं निष्कर्ष पर कैसे आया हूं। क्या मेरे पास रिपोर्ट पर स्वायत्तता है या नहीं? मैं आउटपुट का अनुवाद कैसे करूं? – hephestos

3

मैं इस समय केवल numpy.correlate पर टिप्पणी कर सकता हूं। यह एक शक्तिशाली उपकरण है। मैंने इसे दो उद्देश्यों के लिए उपयोग किया है। पहले एक और पद्धति के अंदर एक पैटर्न को मिल रहा है:

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 ! 

दूसरा उपयोग मैं लिए इसका इस्तेमाल किया है (और कैसे परिणाम व्याख्या करने के लिए) आवृत्ति का पता लगाने के लिए है:

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

three hz and two hz with autocorrelation show beneath

दूसरे चोटियों की अनुक्रमणिका खोजें। इससे आप आवृत्ति को खोजने के लिए वापस काम कर सकते हैं।

first_min_index = np.argmin(hz_a_autocorrelation) 
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:]) 
frequency = 1/second_max_index 
संबंधित मुद्दे