หากฉันมีชุดข้อมูลที่สร้างกราฟดังต่อไปนี้ฉันจะกำหนดอัลกอริทึมค่า x ของยอดเขาที่แสดงได้อย่างไร (ในกรณีนี้คือสามชุด):
หากฉันมีชุดข้อมูลที่สร้างกราฟดังต่อไปนี้ฉันจะกำหนดอัลกอริทึมค่า x ของยอดเขาที่แสดงได้อย่างไร (ในกรณีนี้คือสามชุด):
คำตอบ:
วิธีการทั่วไปคือการเรียบข้อมูลแล้วพบยอดโดยการเปรียบเทียบตัวกรองสูงสุดในท้องถิ่นให้เรียบเนียน ใน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 ที่ราบรื่น)
วิธีนี้มีข้อดีหลายประการมากกว่าการสร้างแบบจำลองที่เป็นทางการมากขึ้นสำหรับงานอเนกประสงค์:
มันไม่ได้ใช้รูปแบบข้อมูลที่อุปถัมภ์ใด ๆ
สามารถปรับให้เข้ากับลักษณะข้อมูล
มันสามารถปรับให้เข้ากับการตรวจสอบชนิดของจุดสูงสุดที่สนใจ
w
และspan
และเพื่อค้นพบว่าค่าที่สูงขึ้นของการspan
เปลี่ยนยอดเขา รู้สึกเหมือนว่าขั้นตอนเหล่านี้อาจเป็นไปโดยอัตโนมัติ เช่นสำหรับปัญหาแรกหากเราสามารถประเมินคุณภาพของยอดเขาที่ค้นพบได้เราสามารถเรียกใช้optimize
พารามิเตอร์! สำหรับปัญหาที่สองเช่นเลือกหน้าต่างด้านใดด้านหนึ่งของจุดสูงสุดที่ค้นพบและมองหาค่าที่สูงขึ้น
ดังที่ฉันได้กล่าวถึงในความคิดเห็นว่าอนุกรมเวลาดูเหมือนจะเหมาะสมเป็นระยะ ๆ โมเดลการถดถอยแบบฮาร์มอนิกจะช่วยให้การทำงานราบรื่นและระบุจุดสูงสุดด้วยการใช้การทดสอบอนุพันธ์ครั้งแรกและครั้งที่สอง ฮูเบอร์ชี้ให้เห็นว่าการทดสอบแบบไม่มีพารามิเตอร์ซึ่งมีข้อดีเมื่อมีหลายจุดสูงสุดและฟังก์ชั่นนั้นไม่จำเป็นต้องเป็นระยะ แต่ไม่มีอาหารกลางวันฟรี ในขณะที่มีข้อดีของวิธีการของเขาที่เขากล่าวถึงอาจมีข้อเสียหากแบบจำลองพารามิเตอร์มีความเหมาะสม นั่นคือด้านพลิกเสมอในการใช้เทคนิคที่ไม่ใช่พารามิเตอร์ แม้ว่ามันจะหลีกเลี่ยงสมมติฐานที่เกี่ยวกับพารามิเตอร์ แต่วิธีการของพารามิเตอร์นั้นดีกว่าเมื่อสมมติฐานที่เหมาะสมนั้นมีความเหมาะสม ขั้นตอนของเขายังไม่ได้ใช้ประโยชน์อย่างเต็มที่จากโครงสร้างอนุกรมเวลาในข้อมูล
ฉันคิดว่าในขณะที่มันเหมาะสมที่จะชี้ให้เห็นข้อดีของขั้นตอนที่แนะนำมันเป็นสิ่งสำคัญที่จะชี้ให้เห็นถึงข้อเสียที่อาจเกิดขึ้น ทั้งวิธีการของฉันและ Huber ค้นหาจุดสูงสุดอย่างมีประสิทธิภาพ อย่างไรก็ตามฉันคิดว่ากระบวนการของเขาใช้เวลาเพิ่มขึ้นเล็กน้อยเมื่อค่าสูงสุดในท้องถิ่นต่ำกว่าค่าสูงสุดที่กำหนดไว้ก่อนหน้านี้
วิธีการตรวจจับสัญญาณสูงสุดแบบคลาสสิกในการประมวลผลสัญญาณมีดังนี้:
อีกวิธีหนึ่งที่ใช้งานได้คือการเปรียบเทียบสัญญาณกรองที่มีการบายพาสสูงอย่างคมชัดกับการกรองที่ผ่านการปรับให้เรียบอย่างหนัก (กรองความถี่ต่ำหรือค่ามัธยฐาน) และใช้ขั้นตอนที่ 3
หวังว่านี่จะช่วยได้