ฉันจะหาจุดสูงสุดในชุดข้อมูลได้อย่างไร


47

หากฉันมีชุดข้อมูลที่สร้างกราฟดังต่อไปนี้ฉันจะกำหนดอัลกอริทึมค่า x ของยอดเขาที่แสดงได้อย่างไร (ในกรณีนี้คือสามชุด):

ป้อนคำอธิบายรูปภาพที่นี่


13
ฉันเห็นหกท้องถิ่นสูงสุด คุณหมายถึงสามคน :-) (แน่นอนมันชัดเจน - แรงผลักดันของคำพูดของฉันคือการสนับสนุนให้คุณกำหนด "จุดสูงสุด" อย่างแม่นยำมากขึ้นเพราะนั่นคือกุญแจสำคัญในการสร้างอัลกอริทึมที่ดี)
whuber

3
หากข้อมูลเป็นอนุกรมเวลาเป็นระยะ ๆ โดยมีการเพิ่มสัญญาณรบกวนแบบสุ่มบางส่วนคุณสามารถใส่ฟังก์ชั่นการถดถอยแบบฮาร์มอนิกที่มีระยะเวลาและแอมพลิจูดเป็นพารามิเตอร์ที่ประเมินจากข้อมูล รูปแบบที่เกิดขึ้นจะเป็นฟังก์ชันคาบที่เรียบ (เช่นฟังก์ชันของ sines และ cosines สองสามตัว) และด้วยเหตุนี้มันจะมีจุดเวลาที่ระบุได้ไม่ซ้ำกันเมื่ออนุพันธ์อันดับแรกเป็นศูนย์และอนุพันธ์อันดับสองเป็นลบ นั่นคือยอดเขา สถานที่ที่อนุพันธ์อันดับหนึ่งเป็นศูนย์และอนุพันธ์อันดับที่สองเป็นบวกจะเป็นสิ่งที่เราเรียกว่าร่อง
Michael Chernick

2
ฉันได้เพิ่มแท็กโหมดตรวจสอบคำถามสองสามข้อแล้วพวกเขาจะได้คำตอบที่น่าสนใจ
Andy W

ขอบคุณทุกคนสำหรับคำตอบและความคิดเห็นของคุณขอบคุณมาก! ฉันต้องใช้เวลาพอสมควรในการทำความเข้าใจและใช้อัลกอริธึมที่แนะนำเนื่องจากเกี่ยวข้องกับข้อมูลของฉัน
nonaxiomatic

อาจเป็นเพราะข้อมูลของฉันดังมาก แต่ฉันก็ไม่ประสบความสำเร็จกับคำตอบด้านล่าง แม้ว่าฉันจะประสบความสำเร็จกับคำตอบนี้: stackoverflow.com/a/16350373/84873
Daniel

คำตอบ:


35

วิธีการทั่วไปคือการเรียบข้อมูลแล้วพบยอดโดยการเปรียบเทียบตัวกรองสูงสุดในท้องถิ่นให้เรียบเนียน ใน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)
}

ค่าส่งคืนรวมถึงอาร์กิวเมนต์ของ maxima ท้องถิ่น ( x) - ซึ่งตอบคำถาม - และดัชนีเข้าสู่ x- และ y-arrays ที่เกิดขึ้นสูงสุดในท้องถิ่น ( i)

มีพารามิเตอร์สองตัวที่จะปรับตามสถานการณ์: wคือความกว้างครึ่งหนึ่งของหน้าต่างที่ใช้ในการคำนวณค่าสูงสุดในท้องถิ่น (ค่าของมันควรจะน้อยกว่าครึ่งหนึ่งของความยาวของข้อมูลอย่างมาก) ค่าขนาดเล็กจะรับการกระแทกในพื้นที่เล็ก ๆ อีกอย่าง - ไม่ชัดเจนในรหัสนี้ - เป็นspanอาร์กิวเมนต์ของความloessราบรื่น (โดยทั่วไปแล้วจะอยู่ระหว่างศูนย์ถึงหนึ่งมันสะท้อนความกว้างของหน้าต่างเป็นสัดส่วนของช่วงของค่า x) ค่าที่มีขนาดใหญ่กว่าจะทำให้ข้อมูลราบรื่นยิ่งขึ้น

หากต้องการดูการปรับแต่งนี้เราจะสร้างฟังก์ชั่นทดสอบเล็ก ๆ เพื่อพล็อตผลลัพธ์:

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)

พล็อต

หน้าต่างกว้าง (พล็อตกลาง) หรือเรียบเนียนกว่าเชิงรุก (พล็อตด้านล่าง) กำจัด maxima ท้องถิ่นที่ตรวจพบในพล็อตด้านบน ชุดค่าผสมที่ดีที่สุดที่นี่น่าจะเป็นหน้าต่างกว้างและมีเพียงการปรับให้เรียบเท่านั้นเนื่องจากการปรับให้ราบเรียบก้าวร้าวดูเหมือนจะเปลี่ยนยอดเขาเหล่านี้ (ดูจุดกลางและด้านขวาในพล็อตด้านล่างและเปรียบเทียบตำแหน่งของพวกเขากับจุดสูงสุด ในตัวอย่างนี้w=50และspan=0.05ทำได้ดีมาก (ไม่แสดง)

สังเกตว่า maxima ท้องถิ่นที่จุดปลายทางไม่ถูกตรวจพบ สิ่งเหล่านี้สามารถตรวจสอบแยกกัน (เพื่อสนับสนุนสิ่งนี้ให้argmaxส่งกลับค่า y ที่ราบรื่น)


วิธีนี้มีข้อดีหลายประการมากกว่าการสร้างแบบจำลองที่เป็นทางการมากขึ้นสำหรับงานอเนกประสงค์:

  • มันไม่ได้ใช้รูปแบบข้อมูลที่อุปถัมภ์ใด ๆ

  • สามารถปรับให้เข้ากับลักษณะข้อมูล

  • มันสามารถปรับให้เข้ากับการตรวจสอบชนิดของจุดสูงสุดที่สนใจ


3
ในทางตรงกันข้าม @Michael: ฉันไม่คิดอะไรเกี่ยวกับการเป็นระยะ อันที่จริงตัวอย่างดูเป็นระยะ ๆ แต่ไม่ใช่: สังเกตคำศัพท์กำลังสอง การถดถอยแบบฮาร์มอนิกจะล้มเหลวด้วยตัวอย่างนี้ (และกับซีรี่ส์อื่น ๆ อีกมากมาย) ยิ่งกว่านั้นฉันไม่ได้เลือกอะไรที่ "มองเห็น": มันทำด้วยอัลกอริธึม (ทำไมฉันถึงได้รับความประทับใจอย่างมากที่คุณยังไม่ได้อ่านคำตอบนี้จริง ๆ ?)
whuber

1
ฉันสามารถหาจุดสูงสุดอัลกอริทึมผ่านการทดสอบอนุพันธ์ครั้งแรกและครั้งที่สองในขณะที่คุณต้องใช้วิธีการอื่น (อาจจะเหมือนกับการค้นหาเชิงตัวเลข) ประเด็นของฉันคือไม่พยายามอ้างว่าวิธีใดวิธีหนึ่งดีกว่าวิธีอื่นและฉันก็ไม่ได้วิจารณ์คำตอบของคุณเลย ฉันเห็นความคล้ายคลึงกันมากและมีความแตกต่างกันเล็กน้อยและฉันพยายามทำความเข้าใจให้ชัดเจนยิ่งขึ้นว่าคุณระบุยอดเขาอย่างไร
Michael Chernick

3
O(n)

4
@Michael หากคุณไม่มี "มีเวลา" ในการอ่านคำตอบ / ความคิดเห็นคุณอาจพิจารณางดการตอบกลับ / แสดงความคิดเห็นเกี่ยวกับโพสต์ นี่คือสิ่งที่คุณทำซ้ำ ๆ บ่อยครั้งและมันมักจะนำไปสู่การแลกเปลี่ยนที่ไม่สร้างสรรค์และ / หรือคุณสร้างคำสั่งที่ไม่ถูกต้องซึ่งคุณถอนในภายหลัง ดูเหมือนว่าคุณจะเสียเวลาและคนอื่น ๆ ที่คุณมีส่วนร่วมในการสนทนาดังกล่าว ตัวอย่างเช่นเธรดความคิดเห็นทั้งหมดนี้ต้องใช้เวลามากกว่าการอ่านคำตอบเพื่อเริ่มต้น ทำไมคุณเลือกที่จะใช้เว็บไซต์ในลักษณะนี้ยังคงปริศนาต่อไป ฉันไม่เห็นว่ามันจะมีคนดีอย่างไร
มาโคร

2
ขอบคุณสำหรับแนวทางที่น่าสนใจ ฉันคิดว่าฉันถึงจุดที่ไมเคิลเอื้อมถึง: คุณจำเป็นต้องดูแผนภูมิเพื่อตัดสินใจว่าจะใช้ค่าที่ดีที่สุดสำหรับwและspanและเพื่อค้นพบว่าค่าที่สูงขึ้นของการspanเปลี่ยนยอดเขา รู้สึกเหมือนว่าขั้นตอนเหล่านี้อาจเป็นไปโดยอัตโนมัติ เช่นสำหรับปัญหาแรกหากเราสามารถประเมินคุณภาพของยอดเขาที่ค้นพบได้เราสามารถเรียกใช้optimizeพารามิเตอร์! สำหรับปัญหาที่สองเช่นเลือกหน้าต่างด้านใดด้านหนึ่งของจุดสูงสุดที่ค้นพบและมองหาค่าที่สูงขึ้น
Darren Cook

1

ดังที่ฉันได้กล่าวถึงในความคิดเห็นว่าอนุกรมเวลาดูเหมือนจะเหมาะสมเป็นระยะ ๆ โมเดลการถดถอยแบบฮาร์มอนิกจะช่วยให้การทำงานราบรื่นและระบุจุดสูงสุดด้วยการใช้การทดสอบอนุพันธ์ครั้งแรกและครั้งที่สอง ฮูเบอร์ชี้ให้เห็นว่าการทดสอบแบบไม่มีพารามิเตอร์ซึ่งมีข้อดีเมื่อมีหลายจุดสูงสุดและฟังก์ชั่นนั้นไม่จำเป็นต้องเป็นระยะ แต่ไม่มีอาหารกลางวันฟรี ในขณะที่มีข้อดีของวิธีการของเขาที่เขากล่าวถึงอาจมีข้อเสียหากแบบจำลองพารามิเตอร์มีความเหมาะสม นั่นคือด้านพลิกเสมอในการใช้เทคนิคที่ไม่ใช่พารามิเตอร์ แม้ว่ามันจะหลีกเลี่ยงสมมติฐานที่เกี่ยวกับพารามิเตอร์ แต่วิธีการของพารามิเตอร์นั้นดีกว่าเมื่อสมมติฐานที่เหมาะสมนั้นมีความเหมาะสม ขั้นตอนของเขายังไม่ได้ใช้ประโยชน์อย่างเต็มที่จากโครงสร้างอนุกรมเวลาในข้อมูล

ฉันคิดว่าในขณะที่มันเหมาะสมที่จะชี้ให้เห็นข้อดีของขั้นตอนที่แนะนำมันเป็นสิ่งสำคัญที่จะชี้ให้เห็นถึงข้อเสียที่อาจเกิดขึ้น ทั้งวิธีการของฉันและ Huber ค้นหาจุดสูงสุดอย่างมีประสิทธิภาพ อย่างไรก็ตามฉันคิดว่ากระบวนการของเขาใช้เวลาเพิ่มขึ้นเล็กน้อยเมื่อค่าสูงสุดในท้องถิ่นต่ำกว่าค่าสูงสุดที่กำหนดไว้ก่อนหน้านี้


2
คุณช่วยกรุณาแสดงให้เห็นถึง "วิธีที่มีประสิทธิภาพ" ของวิธีการของคุณ ส่วนหนึ่งของความท้าทายคือการกำหนดอัลกอริทึมเพื่อค้นหายอดเขาหลาย ๆ อัน - ซึ่งในกรณีของคุณหมายถึงการหาศูนย์ทั้งหมดของอนุพันธ์ (คำนวณด้วยราคาแพง) ไม่ใช่แค่ศูนย์เดียวและเพื่อให้ชัดเจนเกี่ยวกับจุดวิกฤติเหล่านี้ที่คุณจะจำแนก เป็น "ยอด" และที่ไม่ นอกจากนี้บางส่วนสนับสนุนหรือขยายการเรียกร้องของคุณว่า "วิธีการแบบพารามิเตอร์นั้นดีกว่าเมื่อการตั้งสมมติฐานแบบเหมาะสมมีความเหมาะสม" จะดีเพราะอย่างที่เราทุกคนรู้ว่าการตั้งสมมติฐานแบบพาราเมตริกนั้นไม่ถูกต้องแน่นอน
whuber

@ โฮเบอร์ฉันบอกว่าคุณจะพอดีกับโมเดลจากนั้น modle คือผลรวมของไซน์และโคไซน์ฟังก์ชันเป็นคาบจุดสูงสุดเกิดขึ้นเมื่อทั้งอนุพันธ์อันดับหนึ่งเป็นศูนย์และอนุพันธ์อันดับสองที่จุดศูนย์ลดลง นั่นคือสิ่งที่ฉันหมายถึงเมื่อฉันบอกว่าคุณทำการทดสอบอนุพันธ์ครั้งแรกและครั้งที่สอง ตอนนี้คุณสามารถแก้ปัญหาเพื่อค้นหาวิธีแก้ปัญหาทั้งหมด แต่ถ้าคุณมีจุดสูงสุดหนึ่งจุดส่วนอีกอันคือหนึ่งจุดและหลายจุดห่างจากคำตอบที่คุณมี ประเด็นของฉันคือไม่อ้างสิทธิ์เหนือกว่าของวิธีการใด ๆ ฉันแค่ต้องการชี้ให้เห็นว่าไม่มีอาหารกลางวันฟรี
Michael Chernick

วิธีการแบบไม่มีพารามิเตอร์มีข้อดีคือไม่ต้องใช้การสร้างแบบจำลองสมมติฐานในกรณีนี้ไม่มีการสันนิษฐานว่าเป็นช่วงเวลา คำแถลงของฉันเกี่ยวกับวิธีการทางพารามิเตอร์นั้นดีกว่าวิธีการแบบไม่ใช้พารามิเตอร์เมื่อสมมติฐานการสร้างแบบจำลองควรเป็นที่คุ้นเคยกับคุณ ฉันไม่จำเป็นต้องโต้แย้งเกี่ยวกับการตั้งสมมติฐานแบบพาราเมตริก นั่นคือความเห็นที่ฉันเห็นด้วย แต่ฉันกำลังพูดถึงบางสิ่งบางอย่างเช่นประสิทธิภาพของพิตแมน การประมาณการแบบไม่อิงพารามิเตอร์นั้นไม่มีประสิทธิภาพเท่ากับการประมาณแบบพารามิเตอร์เมื่อแบบจำลองนั้น "ถูกต้อง"
Michael Chernick

นั่นคือทฤษฎี ในทางปฏิบัติแบบจำลองพารามิเตอร์สามารถประมาณความจริงได้ดี ในกรณีนั้นการประมาณค่าพารามิเตอร์ (พูด mle) มีประสิทธิภาพมากกว่าการประมาณการแบบไม่ใช้พารามิเตอร์ นอกจากนี้ช่วงความเชื่อมั่นแบบพาราเมตริกจะดีขึ้นเพราะจะเข้มงวดมากขึ้น แต่หลายครั้งคุณไม่รู้ว่าโมเดลพาราเมตริกนั้นเป็นแบบอย่างที่ดีเพียงใด ในกรณีเช่นนี้คุณต้องตัดสินใจระหว่างนักอนุรักษ์นิยม (มีความปลอดภัย) ด้วยวิธีการแบบไม่มีพารามิเตอร์หรือเป็นตัวหนา (และอาจผิดพลาด) โดยใช้วิธีการแบบพารามิเตอร์
Michael Chernick

1
สิ่งที่ฉันพยายามจะชี้ให้เห็นไมเคิลคือว่าในกรณีนี้วิธีการที่ไม่อิงพารามิเตอร์มีแนวโน้มที่จะไกลได้ดีกว่าวิธีการตัวแปรใด ๆ ยกเว้นเมื่อแล่งข้อมูลโดยเฉพาะอย่างยิ่งอย่างใกล้ชิดกับรูปแบบ - และแล้วแม้มันจะทำงานได้ดี สมมติว่าการเป็นระยะเป็นตัวอย่างที่ดี: อัลกอริธึมของคุณจะทำให้เกิดข้อผิดพลาดในลำดับความสำคัญเท่ากับการแยกออกจากความเป็นระยะในข้อมูล ความเป็นไปได้ของการทำผิดพลาดดังกล่าวจะทำให้ข้อได้เปรียบใด ๆ ที่ได้รับจากประสิทธิภาพของซีมโทติคเพิ่มขึ้น การใช้ขั้นตอนดังกล่าวโดยไม่ต้องทำการทดสอบ GoF อย่างกว้างขวางก่อนจะเป็นความคิดที่ไม่ดี
whuber

1

วิธีการตรวจจับสัญญาณสูงสุดแบบคลาสสิกในการประมวลผลสัญญาณมีดังนี้:

  1. กรองสัญญาณไปยังช่วงที่เหมาะสมพอสมควรขึ้นอยู่กับอัตราการสุ่มตัวอย่างและคุณสมบัติของสัญญาณเช่นสำหรับ ECG, ตัวกรอง bandpass IIR ที่ 0.5-20Hz, ตัวกรอง zero-phase จะช่วยให้มั่นใจได้ว่าไม่มีการเปลี่ยนเฟส (และการหน่วงเวลาที่เกี่ยวข้อง)
  2. การแปลงฮิลแบร์ตหรือเวฟเล็ตสามารถใช้เพื่อเน้นยอดเขาได้
  3. สามารถใช้เกณฑ์แบบคงที่หรือแบบไดนามิกซึ่งตัวอย่างทั้งหมดที่อยู่เหนือขีด จำกัด จะถือว่าเป็นจุดสูงสุด ในกรณีของเกณฑ์แบบไดนามิกโดยปกติจะถูกกำหนดเป็นค่าเบี่ยงเบนมาตรฐานNหรือสูงกว่าหรือต่ำกว่าค่าเฉลี่ยเคลื่อนที่ของค่าเฉลี่ย

อีกวิธีหนึ่งที่ใช้งานได้คือการเปรียบเทียบสัญญาณกรองที่มีการบายพาสสูงอย่างคมชัดกับการกรองที่ผ่านการปรับให้เรียบอย่างหนัก (กรองความถี่ต่ำหรือค่ามัธยฐาน) และใช้ขั้นตอนที่ 3

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.