5

में महत्वपूर्ण न्यूनतम और अधिकतमता की पहचान करें मुझे गणित के साथ समय श्रृंखला डेटा में स्थानीय न्यूनतम और अधिकतमता की पहचान करने की आवश्यकता है। ऐसा लगता है कि यह करना आसान काम होना चाहिए, लेकिन यह मुश्किल हो जाता है। मैंने इसे मैथफोरम पर पोस्ट किया, लेकिन सोचा कि मुझे यहां कुछ अतिरिक्त आंखें मिल सकती हैं।समय-श्रृंखला w/Mathematica

आप एक कागज है कि कम से समस्या पर चर्चा पा सकते हैं: http://www.cs.cmu.edu/~eugene/research/full/compress-series.pdf

मैं इस की कोशिश की है अब तक ...

जाओ और कुछ डाटा प्रारूप:

data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, 2]]; 
data = data/[email protected]; 
data = Transpose[{Range[[email protected]], data}]; 

2 कार्यों को परिभाषित करें:

पहली विधि:

findMinimaMaxima[data_, window_] := With[{k = window}, 
    data[[k + [email protected][Partition[data[[All, 2]], 2 k + 1, 1], x_List /; x[[k + 1]] < Min[Delete[x, k + 1]] || x[[k + 1]] > Max[Delete[x, k + 1]]]]]] 

अब एक और दृष्टिकोण है, हालांकि के रूप में लचीला नहीं: प्रत्येक कार्य करता है क्या पर

findMinimaMaxima2[data_] := data[[[email protected](Length[#] & /@ Split[Prepend[Sign[[email protected][[All, 2]] - [email protected][[All, 2]]], 0]])]] 

देखो। सबसे पहले findMinimaMaxima2 []:

minmax = findMinimaMaxima2[data]; 
{[email protected], [email protected]} 
[email protected] 

इस बारे में 49% डेटा संपीड़न में सभी न्यूनतम और मॅक्सिमा और परिणाम (इस उदाहरण में) का चयन करता है, लेकिन यह खिड़की के विस्तार के लचीलेपन जरूरत नहीं है। यह अन्य विधि करता है।

minmax2 = findMinimaMaxima[data, 2]; 
{[email protected], [email protected]} 
[email protected] 

लेकिन क्या होता है जब हम 60 के लिए विंडो का विस्तार देखो: 2 के एक खिड़की, कम और यकीनन अधिक महत्वपूर्ण एक्सट्रीमा पैदावार

minmax2 = findMinimaMaxima[data, 60]; 
ListLinePlot[{data, minmax2}] 

न्यूनतम और मॅक्सिमा अब वैकल्पिक में से कुछ। findMinimaMaxima की [] उत्पादन के लिए आवेदन findMinimaMaxima2 [] एक समाधान देता है ...

minmax3 = findMinimaMaxima2[minmax2]; 
ListLinePlot[{data, minmax2, minmax3}] 

, लेकिन इस समस्या का समाधान करने के लिए एक अनाड़ी रास्ते की तरह लगता है।

तो, बाएं और दाएं को देखने के लिए एक निश्चित विंडो का उपयोग करने का विचार वह सब कुछ नहीं करता जो कोई चाहें। मैंने एक ऐसे विकल्प के बारे में सोचना शुरू किया जो एक श्रेणी मूल्य आर (उदाहरण के लिए एक प्रतिशत ऊपर या नीचे) का उपयोग कर सकता है कि फ़ंक्शन को अगले न्यूनतम या अधिकतमता को सेट करने के लिए मिलने या उससे अधिक की आवश्यकता होगी। यहाँ मेरी पहली कोशिश है:

findMinimaMaxima3[data_, R_] := Module[{d, n, positions}, 
    d = data[[All, 2]]; 
    n = Transpose[{data[[All, 1]], [email protected][If[(#2 <= #1 + #1*R && #2 >= #1) || (#2 >= #1 - #1* R && #2 <= #1), #1, #2] &, d[[1]], d]}]; 
    n = Sign[[email protected][[All, 2]] - [email protected][[All, 2]]]; 
    positions = [email protected][Most[Position[n, Except[0]]]]; 
    data[[positions]] 
    ] 

minmax4 = findMinimaMaxima3[data, 0.1]; 
ListLinePlot[{data, minmax4}] 

यह भी साथ पोस्ट प्रोसेसिंग से लाभ findMinimaMaxima2 []

ListLinePlot[{data, findMinimaMaxima2[minmax4]}] 

लेकिन अगर तुम करीब से देखो, तो आप देखते हैं कि यह चरम याद करते हैं अगर वे में आर मूल्य से परे जाना कई पदों - चार्ट के पूर्ण न्यूनतम और अधिकतम के साथ-साथ बड़ी चाल के साथ-साथ ऊपर और नीचे भी शामिल हैं। आर मान बदलने से पता चलता है कि यह शीर्ष और बोतलों को और भी याद करता है:

minmax4 = findMinimaMaxima3[data, 0.15]; 
ListLinePlot[{data, minmax4}] 

तो, मुझे पुनर्विचार करने की आवश्यकता है। कोई भी डेटा की साजिश देख सकता है और आसानी से महत्वपूर्ण न्यूनतम और अधिकतमता की पहचान कर सकता है। ऐसा करने के लिए एल्गोरिदम प्राप्त करना मुश्किल लगता है। एक खिड़की और/या आर मान समाधान के लिए महत्वपूर्ण प्रतीत होता है, लेकिन न तो अपने आप पर पर्याप्त लगता है (कम से कम ऊपर के दृष्टिकोण में नहीं)।

किसी को भी दृष्टिकोण से किसी से पता चला बढ़ाने या महत्वपूर्ण न्यूनतम और मॅक्सिमा की पहचान करने के लिए एक विकल्प का सुझाव कर सकते हैं?

इस कोड और उस में चर्चा के सभी के साथ एक नोटबुक अग्रेषित करने के लिए खुश। अगर किसी को इसकी ज़रूरत है तो मुझे बताएं।

धन्यवाद, Jagra

+0

बारी मॅक्सिमा और न्यूनतम मापदंड हमेशा मूल्य में बदलाव में महत्वपूर्ण नहीं है। यहाँ http://i.imgur.com/nsIK7.png –

+0

की तरह मुझे StackOverflow में आपका स्वागत है और तीन बातें याद दिलाना हम आम तौर पर यहाँ करने के लिए अनुमति दें: 1) आप मदद प्राप्त करते हैं, यह भी देने के लिए ** सवालों का जवाब दे कोशिश ** विशेषज्ञता के क्षेत्र में 2) ['एफएक्यू पढ़ें'] (http://tinyurl.com/2vycnvr) 3) जब आप अच्छे क्यू एंड ए देखते हैं, तो उन्हें 'ग्रे त्रिकोणों का उपयोग करके] वोट दें (http: // i .imgur.com/kygEP.png), क्योंकि सिस्टम की विश्वसनीयता उस प्रतिष्ठा पर आधारित है जो उपयोगकर्ता अपने ज्ञान को साझा करके हासिल करते हैं। यह भी जवाब स्वीकार करना याद रखें कि आपकी समस्या, अगर कोई है, ['चेकमार्क साइन दबाकर] बेहतर तरीके से हल करता है (http://i.imgur.com/uqJeW.png) –

उत्तर

8

मैं एक सतत दृष्टिकोण का उपयोग करने का सुझाव देते हैं। निम्नलिखित कार्य this post से लिया जाता है, और जब वे संकलित बिना अधिक संक्षेप में लिखा जा सकता है, वे काम करेंगे:

dplot = ListLinePlot[data] 

यहाँ हम साजिश:

localMinPositionsC = 
Compile[{{pts, _Real, 1}}, 
    Module[{result = Table[0, {Length[pts]}], i = 1, ctr = 0}, 
    For[i = 2, i < Length[pts], i++, 
    If[pts[[i - 1]] > pts[[i]] && pts[[i + 1]] > pts[[i]], 
     result[[++ctr]] = i]]; 
    Take[result, ctr]]]; 

localMaxPositionsC = 
    Compile[{{pts, _Real, 1}}, 
    Module[{result = Table[0, {Length[pts]}], i = 1, ctr = 0}, 
     For[i = 2, i < Length[pts], i++, 
     If[pts[[i - 1]] < pts[[i]] && pts[[i + 1]] < pts[[i]], 
      result[[++ctr]] = i]]; 
     Take[result, ctr]]]; 

यहाँ अपने डेटा साजिश है मिनट, जो 3 पुनरावृत्तियों के बाद प्राप्त कर रहे हैं:

mins = ListPlot[Nest[#[[localMinPositionsC[#[[All, 2]]]]] &, data, 3], 
    PlotStyle -> Directive[PointSize[0.015], Red]] 

मॅक्सिमा के लिए एक ही:

maxs = ListPlot[Nest[#[[localMaxPositionsC[#[[All, 2]]]]] &, data, 3], 
    PlotStyle -> Directive[PointSize[0.015], Green]] 

और जिसके परिणामस्वरूप साजिश:

Show[{dplot, mins, maxs}] 

enter image description here

आप और अधिक मोटे सुक्ष्म या महीन न्यूनतम/मॅक्सिमा पाने के लिए पुनरावृत्तियों की संख्या भिन्न हो सकते हैं,।

संपादित करें:

वास्तव में, मैं सिर्फ देखा है कि अंक की एक जोड़ी अभी भी इस विधि से चूक गए थे, दोनों न्यूनतम और मॅक्सिमा के लिए। इसलिए, मैं इसे एक शुरुआती बिंदु के रूप में सुझाव देता हूं, पूर्ण समाधान के रूप में नहीं। शायद, आप न्यूनतम/मॅक्सिमा का विश्लेषण कर सकता है, विभिन्न पुनरावृत्तियों से आ रही है, और कभी कभी एक "पिछला", अधिक परिष्कृत एक से भी शामिल है। साथ ही, इस तरह के कार्यों का एकमात्र "भौतिक कारण" यह है कि वित्तीय आंकड़ों की प्रकृति कई अलग-अलग अलग-अलग पैमाने के साथ फ्रैक्टल-जैसी प्रतीत होती है। उपरोक्त नेस्ट-एस में प्रत्येक पुनरावृत्ति एक विशेष पैमाने पर लक्षित करता है। यह एक मनमाना संकेत के लिए इतना अच्छा काम नहीं करेगा।

+0

लियोनिड - समाधान के लिए बहुत धन्यवाद। दो त्वरित प्रश्न: 1. संकलित कार्यों में मैं आपके "_Real" के उपयोग से अपरिचित हूं। क्या आप समझा सकते हैं कि यह क्या करता है? और 2. जैसा कि मै मैथमैटिका में कुछ भी करता हूं, जब भी मैं आपकी पुस्तक "मैथमैटिका प्रोग्रामिंग: एक उन्नत परिचय" का एक पीडीएफ रखता हूं, मुझे आश्चर्य है कि क्या आप टिप्पणी कर सकते हैं कि आपने स्थानीय मिनपॉजिशन सी और स्थानीय मैक्सपॉजिशन सी में लूप के लिए क्यों महसूस किया इस स्थिति में अधिक कार्यात्मक दृष्टिकोण की तुलना में पसंद है क्योंकि आप अक्सर अपनी पुस्तक में वकालत करते हैं? फिर बहुत धन्यवाद। – Jagra

+0

@ जगरा - _Real का उपयोग प्रकार घोषित करने के लिए किया जाता है। यह तर्क जो कुछ रैंक के tensors हैं के लिए आवश्यक है - वैक्टर, मैट्रिक्स, आदि है कि विशेष मामले में, हम reals का एक वेक्टर (रैंक 1 टेन्सर) की जरूरत है। आप दस्तावेज़ीकरण में अच्छे उदाहरण पा सकते हैं।संकलन का उपयोग करने के लिए, आप सही हैं - मेरे पास उस पल में एक तेज़ कार्यात्मक लिखने और परीक्षण करने के लिए समय नहीं था, और मूल समस्या के लिए जहां मैंने उन्हें इस्तेमाल किया था (जिसे मैंने लिंक किया था), गति महत्वपूर्ण थी। आपके मामले में, आपको विभाजन के साथ कुछ लिखने में सक्षम होना चाहिए जो इस गणना के लिए पर्याप्त तेज़ होगा। –

+0

समझ गया। एक बार फिर धन्यवाद। – Jagra