Nếu tôi có một tập dữ liệu tạo ra một biểu đồ như sau, làm thế nào để tôi xác định một cách thuật toán các giá trị x của các đỉnh được hiển thị (trong trường hợp này là ba trong số chúng):
Nếu tôi có một tập dữ liệu tạo ra một biểu đồ như sau, làm thế nào để tôi xác định một cách thuật toán các giá trị x của các đỉnh được hiển thị (trong trường hợp này là ba trong số chúng):
Câu trả lời:
Một cách tiếp cận chung là làm mịn dữ liệu và sau đó tìm các đỉnh bằng cách so sánh bộ lọc tối đa cục bộ với độ mịn . Trong 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)
}
Giá trị trả về của nó bao gồm các đối số của cực đại cục bộ ( x
) - câu trả lời cho câu hỏi - và các chỉ mục vào các mảng x và y trong đó các cực đại cục bộ đó xảy ra ( i
).
Có hai tham số được điều chỉnh theo các trường hợp: w
là nửa chiều rộng của cửa sổ được sử dụng để tính toán tối đa cục bộ. (Giá trị của nó phải nhỏ hơn một nửa chiều dài của mảng dữ liệu.) Các giá trị nhỏ sẽ thu được các va chạm cục bộ nhỏ trong khi các giá trị lớn hơn sẽ vượt qua các giá trị đó. Một cái khác - không rõ ràng trong mã này - là span
đối số của loess
mượt mà hơn. (Nó thường nằm giữa 0 và 1; nó phản ánh chiều rộng cửa sổ dưới dạng tỷ lệ của phạm vi giá trị x.) Các giá trị lớn hơn sẽ làm mịn dữ liệu mạnh hơn, làm cho các va chạm cục bộ biến mất hoàn toàn.
Để xem điều chỉnh này có hiệu lực, hãy tạo một hàm kiểm tra nhỏ để vẽ kết quả:
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)
}
Dưới đây là một vài thí nghiệm áp dụng cho một số dữ liệu tổng hợp, hơi ồn.
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)
Hoặc một cửa sổ rộng (âm mưu giữa) hoặc trơn tru hơn (âm mưu dưới cùng) loại bỏ cực đại cục bộ được phát hiện trong âm mưu trên cùng. Sự kết hợp tốt nhất ở đây có thể là một cửa sổ rộng và chỉ làm mịn nhẹ nhàng, bởi vì làm mịn tích cực xuất hiện để dịch chuyển các đỉnh này (xem điểm giữa và điểm phải trong ô dưới cùng và so sánh vị trí của chúng với các đỉnh rõ ràng của dữ liệu thô). Trong ví dụ này, w=50
và span=0.05
làm một công việc tuyệt vời (không hiển thị).
Lưu ý cực đại cục bộ tại các điểm cuối không được phát hiện. Đây có thể được kiểm tra riêng. (Để hỗ trợ điều này, argmax
trả về các giá trị y được làm mịn.)
Cách tiếp cận này có một số lợi thế so với mô hình chính thức hơn cho công việc có mục đích chung:
Nó không áp dụng bất kỳ mô hình định trước của dữ liệu.
Nó có thể được thích nghi với các đặc điểm dữ liệu.
Nó có thể được điều chỉnh để phát hiện các loại đỉnh mà người ta quan tâm.
w
và span
, và cũng để khám phá ra rằng các giá trị cao hơn của span
việc dịch chuyển các đỉnh. Nó cảm thấy như thậm chí các bước này có thể được tự động. Ví dụ, đối với vấn đề đầu tiên, nếu chúng ta có thể đánh giá chất lượng của các đỉnh được phát hiện, chúng ta có thể chạy optimize
trên các tham số! Đối với vấn đề thứ hai, ví dụ: chọn một cửa sổ ở hai bên của đỉnh được phát hiện và tìm kiếm các giá trị cao hơn.
Như tôi đã đề cập trong nhận xét nếu chuỗi thời gian có vẻ phù hợp định kỳ, mô hình hồi quy hài hòa cung cấp một cách để làm mịn chức năng và xác định đỉnh bằng cách áp dụng các phép thử đạo hàm thứ nhất và thứ hai. Huber đã chỉ ra một bài kiểm tra không tham số có lợi thế khi có nhiều đỉnh và hàm không nhất thiết phải định kỳ. Nhưng không có bữa trưa miễn phí. Mặc dù có những ưu điểm đối với phương pháp của anh ta mà anh ta đề cập có thể có những nhược điểm nếu một mô hình tham số phù hợp. Đó luôn là mặt trái của việc sử dụng các kỹ thuật phi tham số. Mặc dù nó tránh được các giả định tham số, cách tiếp cận tham số sẽ tốt hơn khi các giả định tham số là phù hợp. Thủ tục của anh ta cũng không tận dụng hết cấu trúc chuỗi thời gian trong dữ liệu.
Tôi nghĩ rằng trong khi nó là phù hợp để chỉ ra những lợi thế của một thủ tục được đề xuất, nó cũng quan trọng để chỉ ra những nhược điểm tiềm năng. Cả cách tiếp cận của tôi và Huber đều tìm thấy các đỉnh một cách hiệu quả. Tuy nhiên, tôi nghĩ rằng thủ tục của anh ta sẽ tốn nhiều công sức hơn khi mức tối đa cục bộ thấp hơn mức cao nhất được xác định trước đó.
Một cách tiếp cận phát hiện đỉnh cổ điển trong xử lý tín hiệu như sau:
Một cách tiếp cận khác có hiệu quả là so sánh tín hiệu được lọc đường cao mạnh so với tín hiệu được làm mịn mạnh (thông thấp hoặc lọc trung bình) và áp dụng bước 3.
Hi vọng điêu nay co ich.