2012-10-03 6 views
6

अद्यतन का उपयोग करके यादृच्छिक अंतराल डेटासेट से निश्चित अंतराल डेटासेट बनाएं अद्यतन: मैंने प्रश्न पाठ के निचले हिस्से में तीन उत्तरों का संक्षिप्त विश्लेषण प्रदान किया है और मेरे विकल्पों को समझाया है।स्टेल डेटा

मेरा प्रश्न: स्टेल डेटा का उपयोग कर यादृच्छिक अंतराल डेटासेट से एक निश्चित अंतराल डेटासेट बनाने का सबसे प्रभावी तरीका क्या है?

कुछ पृष्ठभूमि: उपरोक्त आंकड़ों में एक आम समस्या है। अक्सर, किसी को यादृच्छिक समय पर होने वाले अवलोकनों का अनुक्रम होता है। इसे Input पर कॉल करें। लेकिन हर 5 मिनट में कहने वाले अवलोकनों का अनुक्रम चाहता है। इसे Output पर कॉल करें। इस डेटासेट को बनाने के लिए सबसे आम तरीकों में से एक स्टेल डेटा का उपयोग कर रहा है, यानी Output में प्रत्येक अवलोकन को Input में हाल ही में होने वाले अवलोकन के बराबर सेट करें।

TInput = 100; 
TOutput = 50; 

InputTimeStamp = 730486 + cumsum(0.001 * rand(TInput, 1)); 
Input = [InputTimeStamp, randn(TInput, 1)]; 

OutputTimeStamp = 730486.002 + (0:0.001:TOutput * 0.001 - 0.001)'; 
Output = [OutputTimeStamp, NaN(TOutput, 1)]; 

दोनों डेटासेट सहस्राब्दी के मोड़ पर आधी रात के करीब से शुरू:

तो, यहाँ उदाहरण डेटासेट का निर्माण करने के लिए कुछ कोड है। हालांकि, Input में टाइमस्टैम्प यादृच्छिक अंतराल पर होते हैं जबकि Output में टाइमस्टैम्प निश्चित अंतराल पर होते हैं। सादगी के लिए, मैंने यह सुनिश्चित किया है कि Input में पहला अवलोकन हमेशा Output में पहले अवलोकन से पहले होता है। किसी भी जवाब में इस धारणा को बनाने के लिए स्वतंत्र महसूस करें।

sMax = size(Output, 1); 
tMax = size(Input, 1); 
s = 1; 
t = 2; 
%#Loop over input data 
while t <= tMax 
    if Input(t, 1) > Output(s, 1) 
     %#If current obs in Input occurs after current obs in output then set current obs in output equal to previous obs in input 
     Output(s, 2:end) = Input(t-1, 2:end); 
     s = s + 1; 
     %#Check if we've filled out all observations in output 
     if s > sMax 
      break 
     end 
     %#This step is necessary in case we need to use the same input observation twice in a row 
     t = t - 1; 
    end 
    t = t + 1; 
    if t > tMax 
     %#If all remaining observations in output occur after last observation in input, then use last obs in input for all remaining obs in output 
     Output(s:end, 2:end) = Input(end, 2:end); 
     break 
    end 
end 

निश्चित रूप से वहाँ है एक अधिक कुशल, या कम से कम, और अधिक सुरुचिपूर्ण इस समस्या को हल करने के लिए जिस तरह से:

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

उत्तर: हाय सब, मैंने तीन उत्तरों का विश्लेषण किया है, और जैसा कि वे खड़े हैं, Angainor सबसे अच्छा है।

चथोनिक डेमॉन का जवाब, जबकि स्पष्ट रूप से लागू करने के लिए सबसे आसान, वास्तव में धीमा है। यह तब भी सही है जब timeseries ऑब्जेक्ट का रूपांतरण स्पीड टेस्ट के बाहर किया जाता है। मुझे लगता है कि इस समय resample फ़ंक्शन का बहुत अधिक ओवरहेड है। मैं 2011 बी चला रहा हूं, इसलिए यह संभव है कि गणित ने मध्यवर्ती समय में इसे सुधार लिया हो। इसके अलावा, इस विधि को OutputInput के बाद एक से अधिक अवलोकन समाप्त होने के लिए एक अतिरिक्त पंक्ति की आवश्यकता है।

रोडी का जवाब केवल एंजैनोर की तुलना में थोड़ा धीमा चलता है (असुरक्षित यह दोनों histc दृष्टिकोण को नियोजित करते हैं), हालांकि, इसमें कुछ समस्याएं हैं। सबसे पहले, Output में अंतिम अवलोकन को निर्दिष्ट करने की विधि Output में अंतिम अवलोकन के बाद Input में अंतिम अवलोकन के लिए मजबूत नहीं है। यह एक आसान फिक्स है। लेकिन एक दूसरी समस्या है जो मुझे लगता है कि InputTimeStamp को histc पर पहले इनपुट के रूप में OutputTimeStamp एंजैनोर द्वारा अपनाया गया है। यदि आप इनपुट इनपुट सेट करते समय OutputTimeStamp = 730486.002 + (0:0.001:TOutput * 0.001 - 0.001)';OutputTimeStamp = 730486.002 + (0:0.0001:TOutput * 0.0001 - 0.0001)'; बदलते हैं तो समस्या उत्पन्न होती है।

एंगैनोर उस सब कुछ के लिए मजबूत दिखाई देता है जिस पर मैंने इसे फेंक दिया, साथ ही यह सबसे तेज़ था।

मैं विभिन्न इनपुट विनिर्देशों के लिए गति परीक्षण का एक बहुत था - निम्नलिखित संख्या काफी प्रतिनिधि हैं:

मेरे अनुभवहीन पाश: Elapsed time is 8.579535 seconds.

Angainor: Elapsed time is 0.661756 seconds.

Rody: Elapsed time is 0.913304 seconds.

ChthonicDaemon: Elapsed time is 22.916844 seconds.

मैं एंजैनर के समाधान को +1 कर रहा हूं और हल किए गए प्रश्न को चिह्नित कर रहा हूं।

+0

करना होगा बस स्पष्ट होना: यह महत्वपूर्ण है कि बार क्रम में नहीं हैं? ज्यादातर मामलों में अवलोकन सख्ती से बढ़ते समय में किए जाते हैं। – chthonicdaemon

+0

@chthonicdaemon आप मान सकते हैं कि समय आरोही क्रम में हैं। मुझे लगता है कि 2011b में 'टाइम्सरीज़' कक्षा और 'resample' function' दोनों हैं, इसलिए मुझे आपके उत्तर का परीक्षण करने में सक्षम होना चाहिए। चीयर्स। –

उत्तर

1

यहां मेरी समस्या है। histc जाने का रास्ता है:

% find Output timestamps in Input bins 
N = histc(Output(:,1), Input(:,1)); 

% find counts in the non-empty bins 
counts = N(find(N)); 

% find Input signal value associated with every bin 
val = Input(find(N),2); 

% now, replicate every entry entry in val 
% as many times as specified in counts 
index = zeros(1,sum(counts)); 
index(cumsum([1 counts(1:end-1)'])) = 1; 
index = cumsum(index); 
val_rep = val(index) 

% finish the signal with last entry from Input, as needed 
val_rep(end+1:size(Output,1)) = Input(end,2); 

% done 
Output(:,2) = val_rep; 

मैं कुछ अलग इनपुट मॉडल के लिए अपने प्रक्रिया के खिलाफ जाँच की (मैं आउटपुट टाइम स्टांप की संख्या बदल) और परिणाम एक ही हैं। हालांकि, मुझे अभी भी यकीन नहीं है कि मैं आपकी समस्या को समझ गया हूं, इसलिए अगर कुछ गलत है तो मुझे बताएं।

+0

मैंने अपने विकल्पों को समझाया है और प्रश्न पाठ के नीचे सभी 3 उत्तरों का एक संक्षिप्त विश्लेषण जोड़ा है। आपके उत्तरों के लिए फिर से धन्यवाद। –

2

यह "पुराना डेटा" दृष्टिकोण संकेत और टाइम्सरी फ़ील्ड में zero order hold के रूप में जाना जाता है। इसके लिए खोज जल्दी से कई समाधान लाता है। आप मैटलैब 2012b है, तो यह सब में timeseries वर्ग के लिए resample फ़ंक्शन का उपयोग करके बनाया गया है, तो आप बस

TInput = 100; 
TOutput = 50; 

InputTimeStamp = 730486 + cumsum(0.001 * rand(TInput, 1)); 
InputData = randn(TInput, 1); 
InputTimeSeries = timeseries(InputData, InputTimeStamp); 

OutputTimeStamp = 730486.002 + (0:0.001:TOutput * 0.001 - 0.001); 
OutputTimeSeries = resample(InputTimeSeries, OutputTimeStamp, 'zoh'); % zoh stands for zero order hold 
+0

उत्तर के लिए धन्यवाद। मुझे नहीं लगता कि 'रैंड' का उत्पादन जरूरी है क्योंकि 'रैंड' का उत्पादन सख्ती से सकारात्मक है, इसलिए इसके ऊपर एक संचयी योग हां में बढ़ रहा है? –

+0

मैंने अपने विकल्पों को समझाया है और प्रश्न पाठ के नीचे सभी 3 उत्तरों का एक संक्षिप्त विश्लेषण जोड़ा है। आपके उत्तरों के लिए फिर से धन्यवाद। –

+0

मैं cumsum भाग याद किया, धन्यवाद। मुझे आश्चर्य है कि अंतर्निहित अनुकरण इतना धीमा है, लेकिन मुझे लगता है कि यह मैटलैब में बहुत सी चीजों की तरह है, सामान्य दृष्टिकोण मजबूतता सुनिश्चित करने के लिए बहुत सारी जांच करता है। – chthonicdaemon

संबंधित मुद्दे