2014-07-21 3 views
6

नमस्कार लोग MATLAB में एक संख्यात्मक सरणी में तोड़ने बिंदुओं की पहचान करने के लिए, मैं इस नए सवाल है, मुझे आशा है कि तुम मुझे फिर से मदद कर सकते हैं:कैसे

मैं एक वेक्टर है, जो आप अगले लिंक में मिल सकते हैं :

https://drive.google.com/file/d/0B4WGV21GqSL5Y09GU240N3F1YkU/edit?usp=sharing

वेक्टर साजिश रची इस तरह दिखता है:

enter image description here

आप देख सकते हैं, ग्राफ में कुछ हिस्सों हैं जहां डेटा का व्यवहार लगभग रैखिक होता है। यह मैं क्या बारे में बात कर रहा हूँ है:

enter image description here

क्या मैं जरूरत है उन तोड़ने अंक डेटा में कुछ भागों के linearity में आधारित मिल रहा है। और आप शायद खुद से पूछें, क्या होता है जब डेटा का हिस्सा रैखिक नहीं होता है, ठीक है, एल्गोरिदम उस भाग को नहीं लेगा।

मुझे उम्मीद है कि आप मेरी मदद कर सकते हैं, धन्यवाद।

+6

['diff'] (http://www.mathworks.com/help/matlab/ref/diff.html) का उपयोग करके दूसरे व्युत्पन्न (ढलान में परिवर्तन) की गणना करें और देखें कि यह एक निश्चित दहलीज से अधिक है (आदर्श रूप से 0, लेकिन इस बात पर निर्भर करता है कि डेटा कितना शोर है कि यह मामला नहीं होगा)। – excaza

+5

और परिणाम को सुचारू बनाने के लिए कुछ चरण में एक लोपास फ़िल्टर लागू करें, अन्यथा व्युत्पन्न में बहुत अधिक "शोर" –

उत्तर

7

जो आप करने की कोशिश कर रहे हैं उसे पीसवाइड लीनियर टाइम सीरीज़ सेगमेंटेशन कहा जाता है।

इस समस्या को हल करने के लिए कई तरीके हैं जो उनकी जटिलता और सटीकता से भिन्न हैं।

यहाँ सबसे सरल एक, खिड़की विभाजन रपट में कहा जाता है:

function [breaks vals] = segment(data, max_error) 
    breaks = []; 
    vals = []; 
    left = 1; 
    for right = 2:length(data) 
     err = linear_regresion(data(left:right)); 
     if max(abs(err)) > max_error 
      breaks(end+1) = right-1; 
      vals(end+1) = data(right-1); 
      left = right; 
     end 
    end 
end 

function err = linear_regresion(data) 
    n = length(data); 
    x = (1:n)' - (n+1)/2; 
    y = data - mean(data); 
    k = sum(x.*y) ./ sum(x.^2); 
    err = y - k*x; 
end 

यहाँ linear_regresionsimple linear regression algorithm के एक कार्यान्वयन है।

मेरे उदाहरण में मैंने अधिकतम पूर्ण त्रुटि को रोक मानदंड के रूप में उपयोग किया, लेकिन आप इसे किसी अन्य फिटिंग फ़ंक्शन के साथ प्रतिस्थापित कर सकते हैं, उदा। mean squared error

segmentation results

आप this survey paper में इस और अन्य विभाजन तकनीकों के बारे में अधिक जानकारी प्राप्त कर सकते हैं:

यहाँ max_error = 0.04 साथ अपने डेटा को विभाजित का एक उदाहरण है।

+0

होगा, मैं इसे बेहतर नहीं कर सका, वास्तव में धन्यवाद! – lisandrojim