अगर मेरे पास एक डेटा सेट है जो निम्नलिखित के रूप में एक ग्राफ बनाता है, तो मैं दिखाए गए चोटियों के एक्स-मानों को कैसे निर्धारित करूंगा (इस मामले में उनमें से तीन):
अगर मेरे पास एक डेटा सेट है जो निम्नलिखित के रूप में एक ग्राफ बनाता है, तो मैं दिखाए गए चोटियों के एक्स-मानों को कैसे निर्धारित करूंगा (इस मामले में उनमें से तीन):
जवाबों:
एक सामान्य दृष्टिकोण डेटा को सुचारू करना है और फिर एक स्थानीय अधिकतम फ़िल्टर की तुलना चिकनी से करना है । इन R
:
argmax <- function(x, y, w=1, ...) {
require(zoo)
n <- length(y)
y.smooth <- loess(y ~ x, ...)$fitted
y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
i.max <- which(delta <= 0) + w
list(x=x[i.max], i=i.max, y.hat=y.smooth)
}
इसके रिटर्न वैल्यू में स्थानीय मैक्सिमा ( x
) के तर्क शामिल हैं - जो प्रश्न का उत्तर देता है - और x- और y- सरणियों में अनुक्रमणिकाएं जहां उन स्थानीय मैक्सिमा होती हैं ( i
)।
परिस्थितियों को देखते हुए दो पैरामीटर हैं: w
स्थानीय अधिकतम गणना करने के लिए उपयोग की जाने वाली खिड़की की आधी चौड़ाई है। (इसका मान डेटा की सरणी की लंबाई से आधे से भी कम होना चाहिए।) छोटे मान छोटे स्थानीय धक्कों को उठाएंगे जबकि बड़े मान उन पर सही पास करेंगे। एक और - इस कोड में स्पष्ट नहीं - चिकनी span
का तर्क loess
है। (यह आम तौर पर शून्य और एक के बीच होता है; यह एक्स मानों की श्रेणी के अनुपात के रूप में एक खिड़की की चौड़ाई को दर्शाता है।) बड़े मान डेटा को अधिक आक्रामक रूप से चिकना करेंगे, जिससे स्थानीय धक्कों को पूरी तरह से गायब हो जाएगा।
इस ट्यूनिंग को प्रभावी रूप से देखने के लिए, आइए परिणामों को प्लॉट करने के लिए थोड़ा टेस्ट फंक्शन बनाएं:
test <- function(w, span) {
peaks <- argmax(x, y, w=w, span=span)
plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", span, sep=""))
lines(x, peaks$y.hat, lwd=2) #$
y.min <- min(y)
sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
col="Red", lty=2))
points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}
यहाँ कुछ सिंथेटिक, थोड़ा शोर डेटा पर कुछ प्रयोग लागू किए गए हैं।
x <- 1:1000 / 100 - 5
y <- exp(abs(x)/20) * sin(2 * x + (x/5)^2) + cos(10*x) / 5 + rnorm(length(x), sd=0.05)
par(mfrow=c(3,1))
test(2, 0.05)
test(30, 0.05)
test(2, 0.2)
या तो एक विस्तृत खिड़की (मध्य भूखंड) या अधिक आक्रामक चिकनी (निचला भूखंड) शीर्ष भूखंड में स्थानीय मैक्सिमा का पता लगाता है। यहां सबसे अच्छा संयोजन एक विस्तृत खिड़की है और केवल कोमल चौरसाई है, क्योंकि आक्रामक चौरसाई इन चोटियों को स्थानांतरित करने के लिए प्रकट होती है (नीचे की साजिश में मध्य और दाएं बिंदु देखें और उनके स्थानों की तुलना कच्चे डेटा की स्पष्ट चोटियों से करें)। इस उदाहरण में, w=50
और span=0.05
एक बड़ा काम करता है (नहीं दिखाया गया है)।
ध्यान दें कि अंतिम बिंदु पर स्थानीय मैक्सीमा का पता नहीं लगाया जाता है। इनका अलग से निरीक्षण किया जा सकता है। (इसका समर्थन करने के लिए, argmax
स्मूथ वाई-वैल्यू वापस करता है।)
सामान्य कार्य के लिए अधिक औपचारिक मॉडलिंग पर इस दृष्टिकोण के कई फायदे हैं:
यह डेटा के किसी भी पूर्वनिर्मित मॉडल को नहीं अपनाता है।
यह डेटा विशेषताओं के लिए अनुकूलित किया जा सकता है।
यह चोटियों के प्रकार का पता लगाने के लिए अनुकूलित किया जा सकता है, जिसमें कोई दिलचस्पी है।
w
और span
, और भी है कि उच्च मूल्यों को खोजने के लिए span
चोटियों स्थानांतरण किया गया। ऐसा लगता है कि इन चरणों को भी स्वचालित किया जा सकता है। पहले अंक के लिए, अगर हम खोजे गए चोटियों की गुणवत्ता का मूल्यांकन कर सकते हैं, तो हम optimize
मापदंडों पर चल सकते हैं ! दूसरे अंक के लिए, उदाहरण के लिए खोजे गए शिखर के दोनों ओर एक खिड़की चुनें और उच्च मूल्यों की तलाश करें।
जैसा कि मैंने टिप्पणी में उल्लेख किया है कि यदि समय श्रृंखला आवधिक फिटिंग के लिए प्रतीत होती है एक हार्मोनिक प्रतिगमन मॉडल फ़ंक्शन को सुचारू करने और पहले और दूसरे व्युत्पन्न परीक्षणों को लागू करके चोटी की पहचान करने का एक तरीका प्रदान करता है। ह्यूबर ने एक गैर-पैरामैट्रिक परीक्षण को इंगित किया है जिसमें कई चोटियां हैं और फ़ंक्शन आवधिक रूप से आवश्यक नहीं है। लेकिन मुफ्त लंच नहीं है। जबकि उसकी पद्धति के फायदे हैं कि वह उल्लेख करता है कि यदि पैरामीट्रिक मॉडल उपयुक्त है तो नुकसान हो सकता है। यह हमेशा गैर-तकनीकी तकनीकों का उपयोग करने के लिए फ्लिप पक्ष है। यद्यपि यह पैरामीट्रिक मान्यताओं से बचा जाता है, पैरामीट्रिक मान्यताओं के उपयुक्त होने पर पैरामीट्रिक दृष्टिकोण बेहतर होता है। उनकी प्रक्रिया भी डेटा में समय श्रृंखला संरचना का पूरा लाभ नहीं उठाती है।
मुझे लगता है कि जहां एक सुझाई गई प्रक्रिया के फायदों को इंगित करना उचित है, वहीं संभावित नुकसानों को इंगित करना भी महत्वपूर्ण है। मेरे दृष्टिकोण और ह्यूबर दोनों एक कुशल तरीके से चोटियों को ढूंढते हैं। हालाँकि मुझे लगता है कि उनकी प्रक्रिया थोड़ी अधिक काम करती है जब एक स्थानीय अधिकतम पहले से निर्धारित उच्चतम शिखर से कम होता है।
सिग्नल प्रोसेसिंग में एक क्लासिक चोटी का पता लगाने का तरीका इस प्रकार है:
एक और दृष्टिकोण जो काम करता है वह है एक बड़े पैमाने पर चिकनी (कम-पास या मध्य फ़िल्टर) के खिलाफ तेजी से फ़िल्टर किए गए सिग्नल की तुलना करना और चरण 3 लागू करना।
उम्मीद है की यह मदद करेगा।