데이터 세트에서 피크를 찾으려면 어떻게합니까?


47

다음과 같은 그래프를 생성하는 데이터 세트가있는 경우 표시된 피크 (이 경우 3 개)의 x 값을 알고리즘 적으로 결정하는 방법은 무엇입니까?

여기에 이미지 설명을 입력하십시오


13
6 개의 로컬 최대 값을 봅니다. 당신은 어느 세 사람을 언급하고 있습니까? :-). (물론 그것은 분명합니다. 저의 발언은 "피크"를 더 정확하게 정의하도록 장려하는 것입니다.
그것이

3
데이터가 임의의 노이즈 성분이 추가 된 순주기 시계열 인 경우주기 및 진폭이 데이터에서 추정되는 매개 변수 인 고조파 회귀 함수에 적합 할 수 있습니다. 결과 모델은 매끄러운 주기적 함수 (즉, 몇 가지 사인과 코사인의 함수)이므로 1 차 도함수가 0이고 2 차 도함수가 음일 때 고유하게 식별 가능한 시점을 갖게됩니다. 그것들은 최고점 일 것입니다. 1 차 도함수가 0이고 2 차 도함수가 양수인 곳은 우리가 최저점이라고합니다.
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)
}

반환 값에는 x질문에 답하는 로컬 최대 값 ( ) 의 인수 와 해당 로컬 최대 값이 발생하는 x 및 y 배열의 인덱스 ( i)가 포함됩니다.

상황에 따라 조정되는 두 가지 매개 변수가 있습니다 w . 로컬 최대 값을 계산하는 데 사용되는 창의 절반 너비입니다. (값은 데이터 배열 길이의 절반보다 작아야합니다.) 작은 값은 작은 로컬 범프를 선택하는 반면 큰 값은 그 값을 바로 통과합니다. 이 코드에서 명시 적이 지 않은 다른 span것이 loess더 매끄 럽습니다. (일반적으로 0과 1 사이입니다. 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)

줄거리

넓은 창 (중간 플롯) 또는보다 적극적인 부드러운 (하단 플롯)은 상단 플롯에서 감지 된 로컬 최대 값을 제거합니다. 공격적인 스무딩이 이러한 피크를 이동시키는 것처럼 보이기 때문에 여기에서 가장 좋은 조합은 넓은 창이고 부드러운 스무딩 일 것입니다. 이 예에서, w=50그리고 span=0.05훌륭한 일 (미도시)를 않습니다.

엔드 포인트의 로컬 최대 값이 감지 되지 않습니다 . 이들은 별도로 검사 할 수 있습니다. 이를 지원하기 위해 argmax스무딩 된 y 값을 반환합니다.


이 접근법은 범용 작업을위한보다 공식적인 모델링에 비해 몇 가지 장점이 있습니다.

  • 데이터의 선입 모델을 채택하지 않습니다.

  • 데이터 특성에 맞출 수 있습니다.

  • 관심있는 피크의 종류를 감지하도록 조정할 수 있습니다.


3
반대로 @Michael : 나는 주기성에 대해 아무 것도 가정 하지 않습니다 . 실제로, 예제는 주기적으로 보이지만 그렇지 않습니다. 이차 항에 주목하십시오. 고조파 회귀 분석은이 예제와 다른 많은 시리즈에서 실패합니다. 또한, "시각적으로"어떤 것도 선택하지 않습니다. 모두 알고리즘으로 수행됩니다. (이 답변을 실제로 읽지 않았다는 인상을받는 이유는 무엇입니까?)
whuber

1
1 차 및 2 차 도함수 테스트를 통해 알고리즘 적으로 피크를 찾을 수 있지만 다른 방법 (숫자 검색과 같은 것)을 사용해야합니다. 내 요점은 하나의 접근법이 다른 접근법보다 낫다고 주장하려고 시도하지 않았으며 나는 당신의 대답을 전혀 비판하지 않았습니다. 나는 많은 유사점과 약간의 차이점을 보았고 당신이 피크를 식별하는 방법에 대해 더 명확하게 이해하려고 노력했습니다.
Michael Chernick

3
@Michael 피크는 이동 최대 값을 초과하지 않는 위치입니다. 이를 통해 빠르고 쉽게 계산할 수 있습니다. 수치 검색이없고 간단한 스캔 만 가능합니다. 차별화 가능한 스무스를 사용하면 주어진 x 값 사이의 피크를 보간 할 수 있다는 장점이 있습니다. 이는 조잡하거나 고르지 않은 x 해상도에 유용합니다. O(n)
whuber

4
@Michael, 답변 / 댓글을 읽을 시간이없는 경우 게시물에 대한 응답 / 어설 션을 삼가는 것이 좋습니다. 이것은 당신이 반복적으로 한 일이며 종종 비 교환적인 교환으로 이어 지거나 나중에 철회한다는 잘못된 진술을합니다. 시간을 낭비하고 다른 사람들이 그러한 대화에 참여하는 것처럼 보입니다. 예를 들어,이 전체 주석 스레드는 단순히 대답을 읽는 것보다 더 많은 시간이 걸렸습니다. 이런 식으로 사이트를 사용하기로 선택한 이유는 계속해서 나를 괴롭 힙니다. 나는 그것이 어떻게 누군가를 잘하는지 보지 못합니다.
매크로

2
흥미로운 접근법에 감사드립니다. 마이클이 도달 한 포인트도 얻었습니다. 차트를보고 wspan에 대한 최상의 값을 결정하고 더 높은 값이 span피크를 이동하고 있음을 발견해야했습니다 . 이 단계조차 자동화 될 수 있다고 생각합니다. 예를 들어 첫 번째 문제에서 발견 된 피크의 품질을 평가할 수 있으면 optimize매개 변수를 실행할 수 있습니다 ! 두 번째 문제의 경우, 예를 들어 발견 된 피크의 양쪽에서 창을 선택하고 더 높은 값을 찾으십시오.
대런 쿡

1

주석에서 언급했듯이 시계열이 주기적으로 적합하면 고조파 회귀 모델이 함수를 부드럽게하고 1 차 및 2 차 미분 테스트를 적용하여 피크를 식별하는 방법을 제공합니다. Huber는 여러 개의 피크가 있고 기능이 반드시 주기적 일 필요가없는 경우 장점이있는 비모수 테스트를 지적했습니다. 그러나 무료 점심은 없습니다. 그가 언급 한 방법에는 장점이 있지만 파라 메트릭 모델이 적절한 경우 단점이있을 수 있습니다. 그것은 항상 비모수 적 기법을 사용하는 것과 반대입니다. 파라 메트릭 가정을 피하지만 파라 메트릭 가정이 적절할 때 파라 메트릭 접근 방식이 더 좋습니다. 그의 절차는 또한 데이터의 시계열 구조를 최대한 활용하지 않습니다.

제안 된 절차의 장점을 지적하는 것이 적절하지만 잠재적 인 단점을 지적하는 것도 중요하다고 생각합니다. 내 접근 방식과 Huber는 효율적인 방식으로 최고점을 찾습니다. 그러나 로컬 최대 값이 이전에 결정된 최고 피크보다 낮은 경우 그의 절차가 약간 더 많은 작업이 필요하다고 생각합니다.


2
당신의 접근 방식의 "효율적인 방식"을 설명해 주시겠습니까? 도전의 일부는 여러 피크 를 찾기 위해 알고리즘을 고안하는 것입니다. 여기서는 0이 아닌 (비싸게 계산 된) 도함수의 모든 0을 찾는 것을 의미하며 분류 할 중요한 포인트에 대해 명시 적으로 명시해야합니다 "피크"와 같은 것은 아닙니다. 또한, "모수 적 가정이 적절할 때 모수 적 접근법이 더 낫다"는 귀하의 주장에 대한 일부지지 또는 증폭이 좋을 것입니다. 모두 알고 있듯이, 모수 적 가정은 결코 정확하지 않습니다.
whuber

@ whuber 나는 모델이 적합 한 사인과 코사인이기 때문에 함수가 주기적이기 때문에 첫 번째 도함수가 0이고 두 번째 도함수가 0 점에서 줄어들 때 피크가 발생한다고 말했다. 그것이 내가 당신이 1 차 및 2 차 미분 테스트를한다고 말했을 때의 의미입니다. 이제 모든 솔루션을 찾기 위해 풀 수 있지만 한 피크가 있으면 다른주기는 솔루션에서 한 기간 및 여러 기간 떨어져 있습니다. 내 요점은 방법의 우월성을 주장하지 않는 것입니다. 나는 단지 무료 점심이 없다는 것을 지적하고 싶습니다.
Michael Chernick

비모수 적 방법은 모델링 가정을 필요로하지 않는 이점이 있으며,이 경우 주기성을 가정하지 않습니다. 모델링 가정이 적용 할 때 비모수 적 접근 방식보다 더 나은 모수 적 접근 방식에 대한 나의 진술은 매우 친숙해야합니다. 파라 메트릭 가정이 정확히 유지되지 않는다는 것에 대해서는 논쟁 할 필요가 없습니다. 그것은 기본적으로 동의하는 의견입니다. 그러나 나는 Pitman 효율과 같은 것에 대해 이야기하고 있습니다. 비모수 추정값은 모형이 "정확한"경우 모수 추정값보다 효율적이지 않습니다.
Michael Chernick

그것은 이론이다. 실제로 파라 메트릭 모델은 현실에 대한 근사치가 될 수 있습니다. 이 경우 모수 추정치 (예 : mle)가 비모수 추정치보다 효율적입니다. 또한 파라 메트릭 신뢰 구간은 더 빡빡하기 때문에 더 좋습니다. 그러나 파라 메트릭 모델이 귀하의 예에 얼마나 적합한 지 잘 모르는 경우가 많습니다. 이러한 경우 비모수 적 접근 방식으로 보수적 (안전)을 선택하거나 매개 변수 적 접근 방식을 사용하여 굵게 (가능하면 잘못) 결정해야합니다.
Michael Chernick

1
Michael이 제안한 것은이 경우 비모수 적 접근 방식이 데이터가 특히 모델과 밀접한 관계가있는 경우를 제외하고는 모든 매개 변수 적 접근 방식보다 훨씬 우수 할 것입니다. 주기성을 가정하는 것이 좋은 예입니다. 알고리즘은 데이터 내에서 주기성을 벗어나는 것과 같은 크기의 오류를 발생시킵니다. 이러한 실수를 저지를 가능성은 점근 효율이 높아짐으로써 얻을 수있는 모든 이점을 무효화합니다. 광범위한 GoF 테스트를 수행하지 않고 이러한 절차를 사용하는 것은 좋지 않습니다.
whuber

1

신호 처리에서 일반적인 피크 검출 방식은 다음과 같습니다.

  1. 샘플링 속도 및 신호 특성에 따라 신호를 합리적인 합리적인 범위로 필터링합니다 (예 : ECG, IIR 대역 통과 필터 @ 0.5-20Hz).
  2. 힐버트 변환 또는 웨이블릿 접근법을 사용하여 피크를 강조 할 수 있습니다.
  3. 그런 다음 정적 또는 동적 임계 값을 적용 할 수 있으며, 임계 값 위의 모든 샘플은 피크로 간주됩니다. 동적 임계 값의 경우 일반적 으로 평균의 이동 평균 추정값 위 또는 아래의 임계 값 N 표준 편차 로 정의됩니다 .

작동하는 또 다른 방법은 급격하게 고역 통과 필터링 된 신호와 심하게 평활화 (저역 통과 또는 중간 필터링)를 비교하고 3 단계를 적용하는 것입니다.

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.