Bagaimana cara menemukan puncak dalam dataset?

47

Jika saya memiliki kumpulan data yang menghasilkan grafik seperti berikut ini, bagaimana saya secara algoritmik menentukan nilai x dari puncak yang ditampilkan (dalam hal ini tiga di antaranya):

masukkan deskripsi gambar di sini

nonaxiomatic
sumber
13
Saya melihat enam maxima lokal. Tiga yang manakah yang Anda maksud? :-). (Tentu saja sudah jelas - tekanan dari komentar saya adalah mendorong Anda untuk mendefinisikan "puncak" secara lebih tepat, karena itulah kunci untuk menciptakan algoritma yang baik.)
whuber
3
Jika data adalah serangkaian waktu murni periodik dengan beberapa komponen derau acak ditambahkan, Anda dapat menyesuaikan fungsi regresi harmonik di mana periode dan amplitudo adalah parameter yang diperkirakan dari data. Model yang dihasilkan akan menjadi fungsi periodik yang halus (yaitu fungsi beberapa sinus dan cosinus) dan karenanya akan memiliki titik waktu yang dapat diidentifikasi secara unik ketika turunan pertama adalah nol dan turunan kedua negatif. Itu akan menjadi puncaknya. Tempat-tempat di mana turunan pertama adalah nol dan turunan kedua adalah positif yang akan kita sebut palung.
Michael Chernick
2
Saya telah menambahkan tag mode, periksa beberapa pertanyaan itu, mereka akan memiliki jawaban yang menarik.
Andy W
Terima kasih semuanya atas jawaban dan komentar Anda, sangat kami hargai! Saya perlu waktu untuk memahami dan mengimplementasikan algoritma yang disarankan karena terkait dengan data saya, tetapi saya akan memastikan saya memperbarui nanti dengan umpan balik.
non
Mungkin karena data saya sangat berisik, tetapi saya tidak berhasil dengan jawaban di bawah ini. Padahal, saya memang berhasil dengan jawaban ini: stackoverflow.com/a/16350373/84873
Daniel

Jawaban:

35

Pendekatan umum adalah memuluskan data dan kemudian menemukan puncak dengan membandingkan filter maksimum lokal dengan smooth . Di 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)
}

Nilai kembalinya meliputi argumen dari maxima lokal ( x) - yang menjawab pertanyaan - dan indeks ke dalam array x dan y di mana maxima lokal tersebut muncul ( i).

Ada dua parameter yang harus disesuaikan dengan keadaan: w adalah setengah lebar jendela yang digunakan untuk menghitung maksimum lokal. (Nilainya harus secara substansial kurang dari setengah panjang array data.) Nilai kecil akan mengambil benjolan lokal kecil sedangkan nilai yang lebih besar akan melewati itu. Lain - tidak eksplisit dalam kode ini - adalah spanargumen yang loesslebih halus. (Ini biasanya antara nol dan satu; itu mencerminkan lebar jendela sebagai proporsi dari kisaran nilai x.) Nilai yang lebih besar akan memuluskan data lebih agresif, membuat benjolan lokal hilang sama sekali.

Untuk melihat penyempurnaan ini, mari buat fungsi uji kecil untuk memplot hasil:

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)
}

Berikut adalah beberapa percobaan yang diterapkan pada beberapa data sintetis dan sedikit bising.

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)

Plot

Baik jendela lebar (plot tengah) atau smooth yang lebih agresif (plot bawah) menghilangkan maxima lokal yang terdeteksi di plot atas. Kombinasi terbaik di sini kemungkinan adalah jendela lebar dan hanya penghalusan lembut, karena pemulusan agresif muncul untuk menggeser puncak ini (lihat titik tengah dan kanan di plot bawah dan membandingkan lokasi mereka dengan puncak nyata dari data mentah). Dalam contoh ini, w=50dan span=0.05melakukan pekerjaan dengan baik (tidak ditampilkan).

Perhatikan maxima lokal di titik akhir tidak terdeteksi. Ini dapat diperiksa secara terpisah. (Untuk mendukung ini, argmaxkembalikan nilai-y yang dihaluskan.)


Pendekatan ini memiliki beberapa keunggulan dibandingkan pemodelan yang lebih formal untuk pekerjaan tujuan umum:

  • Itu tidak mengadopsi model data yang terbentuk sebelumnya.

  • Dapat disesuaikan dengan karakteristik data.

  • Dapat disesuaikan untuk mendeteksi jenis-jenis puncak yang diminati.

whuber
sumber
3
Sebaliknya, @Michael: Saya tidak berasumsi tentang periodisitas. Memang, contohnya terlihat berkala tetapi tidak: perhatikan istilah kuadratik. Regresi harmonik akan gagal dengan contoh ini (dan dengan banyak seri lainnya). Selain itu, saya tidak memilih apa pun "secara visual": semuanya dilakukan dengan algoritma. (Mengapa saya mendapat kesan kuat bahwa Anda belum benar-benar membaca jawaban ini?)
whuber
1
Saya dapat menemukan puncak secara algoritmik melalui tes turunan pertama dan kedua sedangkan Anda perlu menggunakan beberapa cara lain (mungkin seperti pencarian numerik). Maksud saya bukan untuk mencoba mengklaim satu pendekatan lebih baik dari yang lain dan saya juga tidak mengkritik jawaban Anda sama sekali. Saya hanya melihat banyak kesamaan dan beberapa perbedaan dan saya mencoba untuk mendapatkan pemahaman yang lebih jelas tentang bagaimana Anda mengidentifikasi puncak Anda.
Michael Chernick
3
@Michael Puncak adalah lokasi yang tidak melebihi batas maksimum bergerak; ini membuatnya cepat dan mudah dihitung: tidak ada pencarian numerik, hanya pemindaian sederhana . Keuntungan menggunakan smooth yang terdiferensiasi adalah bahwa ia dapat menginterpolasi puncak antara nilai x yang diberikan: ini berguna untuk resolusi x kasar atau tidak rata. O(n)
whuber
4
@Michael, jika Anda tidak "punya waktu" untuk membaca jawaban / komentar maka Anda dapat mempertimbangkan untuk tidak menanggapi / membuat pernyataan tentang pos tersebut. Ini adalah sesuatu yang telah Anda lakukan berulang kali dan sering menyebabkan pertukaran tidak konstruktif dan / atau Anda membuat pernyataan yang salah yang kemudian Anda tarik kembali. Sepertinya buang-buang waktu dan orang lain yang terlibat dalam percakapan seperti itu. Sebagai contoh, seluruh utas komentar ini tentu saja membutuhkan waktu lebih dari sekadar membaca jawaban untuk memulai. Mengapa Anda memilih untuk menggunakan situs dengan cara ini terus membuat saya bingung. Saya tidak melihat ada manfaatnya bagi orang lain.
Makro
2
Terima kasih atas pendekatan yang menarik. Saya pikir saya juga mendapatkan poin yang ingin dicapai Michael: Anda perlu melihat grafik untuk menentukan nilai terbaik untuk wdan span, dan juga untuk menemukan bahwa nilai yang lebih tinggi dari spansedang menggeser puncak. Rasanya bahkan langkah-langkah ini bisa otomatis. Misalnya untuk masalah pertama, jika kita dapat mengevaluasi kualitas puncak yang ditemukan, kita dapat menjalankan optimizeparameter! Untuk masalah kedua, mis. Pilih jendela di kedua sisi dari puncak yang ditemukan dan cari nilai yang lebih tinggi.
Darren Cook
1

Seperti yang saya sebutkan dalam komentar jika deret waktu tampak pas secara berkala, model regresi harmonik menyediakan cara untuk memperlancar fungsi dan mengidentifikasi puncak dengan menerapkan tes turunan pertama dan kedua. Huber telah menunjukkan tes nonparametrik yang memiliki keunggulan ketika ada beberapa puncak dan fungsinya tidak harus berkala. Tapi tidak ada makan siang gratis. Meskipun ada keuntungan dari metodenya yang ia sebutkan ada kerugian jika model parametrik sesuai. Itu selalu menjadi sisi lain dari menggunakan teknik nonparametrik. Meskipun menghindari asumsi parametrik, pendekatan parametrik lebih baik ketika asumsi parametrik sesuai. Prosedurnya juga tidak memanfaatkan sepenuhnya struktur deret waktu dalam data.

Saya pikir meskipun tepat untuk menunjukkan kelebihan dari prosedur yang disarankan, penting juga untuk menunjukkan potensi kerugiannya. Baik pendekatan saya dan Huber menemukan puncak secara efisien. Namun saya pikir prosedurnya membutuhkan lebih banyak kerja ketika maksimum lokal lebih rendah dari puncak tertinggi yang ditentukan sebelumnya.

Michael Chernick
sumber
2
Bisakah Anda menunjukkan "cara efisien" dari pendekatan Anda? Bagian dari tantangannya adalah menyusun algoritma untuk menemukan beberapa puncak - yang dalam kasus Anda berarti menemukan semua nol dari turunan (dihitung secara mahal), bukan hanya satu nol - dan untuk menjadi eksplisit tentang titik kritis mana yang akan Anda klasifikasikan sebagai "puncak" dan mana yang tidak. Juga, beberapa dukungan atau penguatan klaim Anda bahwa "pendekatan parametrik lebih baik ketika asumsi parametrik sesuai" akan baik, karena seperti yang kita semua tahu, asumsi parametrik tidak pernah benar-benar tepat.
Whuber
@whuber saya mengatakan bahwa Anda akan cocok dengan model maka karena modle adalah jumlah dari sinus dan cosinus fungsi periodik puncak terjadi ketika kedua turunan pertama adalah nol dan turunan kedua pada titik nol menurun. Itulah yang saya maksud ketika saya mengatakan bahwa Anda mengambil tes turunan pertama dan kedua. Sekarang Anda dapat memecahkan untuk menemukan semua solusi tetapi jika Anda memiliki satu puncak yang lain adalah satu periode dan beberapa periode dari solusi yang Anda miliki. Maksud saya bukan untuk mengklaim keunggulan metode ini. Saya hanya ingin menunjukkan bahwa tidak ada makan siang gratis.
Michael Chernick
Metode nonparametrik memiliki keuntungan karena tidak memerlukan asumsi pemodelan, dalam hal ini tidak ada asumsi periodisitas. Pernyataan saya tentang pendekatan parametrik lebih baik daripada pendekatan nonparametrik ketika asumsi pemodelan berlaku harus sangat akrab bagi Anda. Saya tidak perlu berdebat tentang asumsi parametrik yang tidak pernah benar-benar berlaku. Itu pendapat yang pada dasarnya saya setujui. Tetapi saya berbicara tentang efisiensi Pitman. Perkiraan nonparametrik tidak seefisien perkiraan parametrik ketika model "benar".
Michael Chernick
Itu adalah teori. Dalam praktiknya model parametrik dapat menjadi pendekatan yang baik untuk kenyataan. Dalam hal ini estimasi parametrik (katakanlah mle) lebih efisien daripada estimasi nonparametrik. Juga interval kepercayaan parametrik akan lebih baik karena mereka akan lebih ketat. Tetapi sering kali Anda tidak tahu seberapa baik model parametrik untuk contoh Anda. Dalam kasus seperti itu, Anda harus memutuskan antara konservativisme (aman) dengan pendekatan nonparametrik atau berani (dan mungkin salah) menggunakan pendekatan parametrik.
Michael Chernick
1
Apa yang saya coba sarankan, Michael, adalah bahwa dalam hal ini pendekatan nonparametrik cenderung jauh lebih baik daripada pendekatan parametrik apa pun kecuali ketika data terpotong erat dengan model - dan bahkan kemudian itu akan berkinerja baik. Dengan asumsi periodisitas adalah contoh yang bagus: algoritme Anda akan membuat kesalahan dengan urutan besarnya yang sama dengan keberangkatan dari periodisitas dalam data. Kemungkinan membuat kesalahan seperti itu meniadakan keuntungan yang diberikan oleh efisiensi asimptotik yang lebih besar. Menggunakan prosedur seperti itu tanpa melakukan pengujian GoF yang luas terlebih dahulu adalah ide yang buruk.
Whuber
1

Pendekatan deteksi puncak klasik dalam pemrosesan sinyal adalah sebagai berikut:

  1. Memfilter sinyal ke kisaran yang wajar, tergantung pada laju pengambilan sampel dan properti sinyal, misalnya untuk EKG, filter bandpass IIR @ 0,5-20Hz, filter fase-nol akan memastikan bahwa tidak ada perubahan fasa (dan jeda waktu terkait) yang diperkenalkan
  2. Transformasi hilbert atau pendekatan wavelet kemudian dapat digunakan untuk menekankan puncak
  3. Ambang statis atau dinamis kemudian dapat diterapkan, di mana semua sampel di atas ambang dianggap puncak. Dalam kasus ambang dinamis, biasanya didefinisikan sebagai ambang batas N standar deviasi di atas atau di bawah estimasi rata-rata bergerak dari rata-rata.

Pendekatan lain yang berfungsi adalah membandingkan sinyal highpass filtered tajam terhadap sangat halus (low-pass atau median filtered) dan menerapkan langkah 3.

Semoga ini membantu.

BGreene
sumber