Aşağıdaki gibi bir grafik üreten bir veri kümem varsa, gösterilen tepelerin x değerlerini algoritmik olarak nasıl belirlerim (bu durumda üçü):
Aşağıdaki gibi bir grafik üreten bir veri kümem varsa, gösterilen tepelerin x değerlerini algoritmik olarak nasıl belirlerim (bu durumda üçü):
Yanıtlar:
Genel bir yaklaşım, verileri yumuşatmak ve daha sonra yerel bir maksimum filtreyi yumuşakla karşılaştırarak zirveleri bulmaktır . İçinde 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)
}
Geri dönüş değeri x
, soruyu cevaplayan yerel maxima ( ) - argümanlarını ve bu yerel maksimaların gerçekleştiği x ve y dizilerine endeksleri içerir ( i
).
Koşullara göre ayarlanması gereken iki parametre vardır: w
yerel maksimum değeri hesaplamak için kullanılan pencerenin yarım genişliği. (Değeri, büyük ölçüde veri dizisinin uzunluğunun yarısından az olmalıdır.) Küçük değerler, küçük yerel tümsekleri toplar, oysa ki büyük değerler tam bunlardan geçer. Bir diğeri - bu kodda açık olmayan - pürüzsüz olanın span
argümanıdır loess
. (Tipik olarak sıfır ile bir arasındadır; x değerinin bir oranı olarak pencere genişliğini yansıtır.) Daha büyük değerler, verileri daha agresif şekilde düzgünleştirir, yerel çarpmaların tamamen kaybolmasını sağlar.
Bu ayarı etkin görmek için, sonuçları çizmek için küçük bir test fonksiyonu oluşturalım:
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)
}
İşte bazı sentetik, hafif gürültülü verilere uygulanan birkaç deney.
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)
Ya geniş bir pencere (orta arsa) ya da daha agresif düz (alt arsa), üst arsada tespit edilen yerel maksimayı ortadan kaldırır. Buradaki en iyi kombinasyon muhtemelen geniş bir penceredir ve yalnızca yumuşak bir pürüzsüzleştirmedir, çünkü agresif pürüzsüzleştirme bu tepe noktalarını değiştiriyor gibi görünmektedir (alt kısımdaki orta ve sağ noktalara bakın ve konumlarını ham verilerin görünür tepe noktalarıyla karşılaştırın). Bu örnekte w=50
ve span=0.05
harika bir iş yapıyor (gösterilmiyor).
Uç noktaları yerel maksimumu vardır dikkat edin değil algıladı. Bunlar ayrı ayrı kontrol edilebilir. (Bunu desteklemek için argmax
, düzleştirilmiş y-değerlerini döndürür.)
Bu yaklaşımın genel amaçlı çalışma için daha resmi modellemeye göre birçok avantajı vardır:
Öngörülen herhangi bir veri modelini benimsemez.
Veri özelliklerine uyarlanabilir.
İlgilenilen pik türlerini tespit etmek için uyarlanabilir.
w
ve span
hem de daha yüksek değerler olduğunu keşfetmeye span
zirveleri kayması bulundu. Bu adımların bile otomatikleştirilebileceğini düşünüyor. Örneğin, ilk sayı için, keşfedilen zirvelerin kalitesini değerlendirebilirsek optimize
, parametreleri çalıştırabiliriz ! İkinci sayı için, örneğin keşfedilen zirvenin her iki tarafını da seçin ve daha yüksek değerler arayın.
Yorumda bahsettiğim gibi, zaman serileri periyodik olarak uyuyor gibi görünüyorsa, harmonik regresyon modeli birinci ve ikinci türev testlerini uygulayarak fonksiyonu düzeltmek ve tepe noktasını tanımlamak için bir yol sağlar. Huber, çoklu tepe noktaları olduğunda ve fonksiyonun mutlaka periyodik olmadığında avantajları olan parametrik olmayan bir test olduğuna işaret etti. Ama bedava yemek yok. Bahsedilen yönteminin avantajları olsa da, parametrik bir model uygunsa dezavantajları olabilir. Bu her zaman parametrik olmayan teknikleri kullanmanın ters yüzünü oluşturur. Parametrik varsayımlardan kaçınmasına rağmen, parametrik varsayımlar uygun olduğunda parametrik yaklaşım daha iyidir. Onun prosedürü ayrıca verilerdeki zaman serisi yapısından tam olarak yararlanamamaktadır.
Önerilen bir prosedürün avantajlarını belirtmek uygun olsa da, potansiyel dezavantajları belirtmenin de önemli olduğunu düşünüyorum. Hem benim yaklaşımım hem de Huber's, zirveleri verimli bir şekilde buluyor. Ancak, yerel azami, önceden belirlenen en yüksek zirveden daha düşük olduğunda, onun prosedürünün biraz daha fazla iş gerektirdiğini düşünüyorum.
Sinyal işlemede klasik bir tepe algılama yaklaşımı aşağıdaki gibidir:
İşe yarayan bir başka yaklaşım ise keskin bir şekilde yüksek geçirilmiş filtrelenmiş sinyali ağır bir şekilde düzeltti (alçak geçirgen veya medyan filtreli) ile karşılaştırmak ve 3. adımı uygulamaktır.
Bu yardımcı olur umarım.