다른 곡선에 맞게 데이터 계열의 세그먼트를 프로그래밍 방식으로 감지하려면 어떻게해야합니까?


14

주어진 데이터 집합의 섹션을 가장 적합한 곡선으로 분리하는 문서화 된 알고리즘이 있습니까?

예를 들어,이 데이터 차트를 보는 대부분의 인간은 정현파 세그먼트, 선형 세그먼트 및 역 지수 세그먼트의 세 부분으로 쉽게 나눌 수 있습니다. 사실, 나는 이것을 사인파, 선 및 간단한 지수 공식으로 만들었습니다.

세 가지 다른 부분이 보이는 데이터 차트

이와 같은 부품을 찾기위한 기존 알고리즘이 있습니까? 그런 다음 다양한 곡선 / 선에 개별적으로 맞춰 데이터의 하위 집합에 가장 적합한 복합 계열을 만들 수 있습니까?

예제에 세그먼트의 끝이 거의 정렬되어 있지만 반드시 그럴 필요는 없습니다. 세그먼트 컷오프에서 값이 갑자기 급격히 떨어질 수도 있습니다. 아마도 그러한 경우를 쉽게 발견 할 수있을 것입니다.

업데이트 : 다음은 실제 데이터의 작은 비트 이미지입니다. 실제 차트

업데이트 2 : 다음은 매우 작은 실제 데이터 세트입니다 (509 개의 데이터 포인트 만 해당).

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

여기가 함께 차트입니다 appoximate 의 위치에 일부 점선으로 표시된 모서리 알려진 실제 요소, 우리가 일반적으로 필요가 없습니다 사치 :

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

그러나 우리가 가진 하나의 사치가 후시입니다. 필자의 경우 데이터는 시계열이 아니라 공간적으로 관련되어 있습니다. 지속적인 방식이 아니라 전체 데이터 세트 (보통 5000-15000 데이터 포인트)를 한 번에 분석하는 것이 좋습니다.


1
ps 첫 번째 게시물 CV; 저는 소프트웨어 개발자이며 일반적으로 더 많이 사용합니다. 현지 금기를 위반 한 경우 사과합니다. 답변에 대한 많은 검색이 여기로 이어 졌으므로 이것이 가장 좋은 곳이라고 생각했습니다.
whybird

왜 데이터를 게시하지 않습니까? 예를 들어 질문에 대답하려고합니다.
IrishStat

한 가지 가능성은 메타 모델을 사용하여 전체 곡선 계열을 한 번에 맞추는 것입니다. 더 정확하게하기 위해, 궁극적 인 목표는 히스토그램을 부드럽게하는 것입니다. 예를 들어 KDE를 사용하십시오. 그런 다음, 커널 너비가 여기에서 사용 된 모델에서와 같이 의 값 범위에 따라 변할 수있는 모델을 사용하면 KDE의 부드러운 추정이 더 정확 해집니다.엑스
user603

1
아이디어가 의미가 있도록 지금까지 예를 구성했습니다. 실제 히스토그램의 경우 복잡한 모양이 겹치는 분포의 혼합을 반영하는 것이 훨씬 더 일반적입니다. 관찰 된 히스토그램의 변경점에 대한 관심은 일반적으로 설득력있게 존재하지 않거나 혼합물을 생각하는 올바른 방법이 아닙니다. 그러나 주파수 막대 또는 확률 분포의 막대 차트 (단지)를 의미하는 통계 과학의 표준보다 훨씬 넓은 방식으로 "히스토그램"을 사용하고있을 수 있습니다.
Nick Cox

@IrishStat-일반적인 데이터 세트에는 5000 ~ 15000 개의 항목이 있습니다. 나는 여기에 요약 된 실제 것을 준비하려고했지만 나쁜 예가 아니라고 다시 시작해야했습니다. 반면에, 그렇게하면 초기에 패턴을 찾기 위해 데이터 덩어리를 부드럽게하고 평균화하는 측면에서 나에게 부분적인 대답을 암시했습니다. 나중에 고마워해야합니다 :) 나는 509 너비의 실제 하나를 가지고 있습니다. 그것이 좋을 것 같습니다. 가능한 경우 질문에 추가하겠습니다.
whybird

답변:


2

질문에 대한 나의 해석은 OP가 HAC 잔차가 아니라 제공된 예제의 형태에 맞는 방법론을 찾고 있다는 것입니다. 또한 사람이나 분석가의 개입이 필요없는 자동화 된 루틴이 필요합니다. Box-Jenkins는이 스레드에 중점을 두었음에도 불구하고 적절한 분석가의 참여가 필요하기 때문에 적절하지 않을 수 있습니다.

이 유형의 비 모멘트 기반 패턴 일치에 대해 R 모듈이 존재합니다. 순열 분포 클러스터링은 Max Planck Institute 과학자가 개발 한 패턴 일치 기술로, 사용자가 설명한 기준을 충족합니다. 이 응용 프로그램은 시계열 데이터에 적용되지만 이에 국한되지는 않습니다. 다음은 개발 된 R 모듈에 대한 인용입니다.

pdc : Andreas Brandmaier의 시계열의 복잡성 기반 클러스터링을위한 R 패키지

PDC 외에도 UC Irvine의 Eamon Keogh가 개발 한 기계 학습, iSax 루틴도 있습니다.

마지막으로, 데이터 스매싱 : 데이터에서 숨어있는 질서 찾기 에 관한이 백서가 있습니다 .Chattopadhyay와 Lipson에 의해. 영리한 제목을 넘어서서, 직장에는 진지한 목적이 있습니다. 개요는 다음과 같습니다. "자동 음성 인식에서 특이한 별 발견에 이르기까지 거의 모든 자동화 된 검색 작업의 기본은 데이터 스트림을 서로 비교 및 ​​대조하여 연결 및 스팟 이상 치를 식별하는 기능입니다. 그러나 데이터의 보급에도 불구하고 자동화 된 방법 주요 병목 현상은 오늘날 대부분의 데이터 비교 알고리즘이 데이터의 '기능'이 비교에 어떤 관련이 있는지를 지정하기 위해 인간 전문가에 의존한다는 것입니다. 여기서, 우리는 임의의 소스 간의 유사성을 추정하는 새로운 원칙을 제안합니다 도메인 지식이나 학습을 전혀 사용하지 않는 데이터 스트림. 우리는이 원칙을 여러 실제 도전 과제의 데이터 분석에 적용하는 방법을 보여줍니다. 간질 발작과 관련된 전자 뇌파 패턴의 명확성, 심장 음 녹음에서 이상 심장 활동의 감지 및 원시 광도계에서 천체의 분류를 포함합니다. 이러한 모든 경우에 도메인 지식에 액세스 할 수없는 경우 도메인 전문가가 고안 한 전문 알고리즘 및 휴리스틱에 의해 달성 된 정확도와 동등한 성능을 보여줍니다. 데이터 스매싱 원칙은 특히 전문가가 무엇을 찾아야할지 모르는 경우 점점 더 복잡한 관측을 이해하는 데 도움이 될 수 있습니다. " 이러한 모든 경우에 도메인 지식에 액세스 할 수없는 경우 도메인 전문가가 고안 한 전문 알고리즘 및 휴리스틱에 의해 달성 된 정확도와 동등한 성능을 보여줍니다. 데이터 스매싱 원칙은 특히 전문가가 무엇을 찾아야할지 모르는 경우 점점 더 복잡한 관측을 이해하는 데 도움이 될 수 있습니다. " 이러한 모든 경우에 도메인 지식에 액세스 할 수없는 경우 도메인 전문가가 고안 한 전문 알고리즘 및 휴리스틱에 의해 달성 된 정확도와 동등한 성능을 보여줍니다. 데이터 스매싱 원칙은 특히 전문가가 무엇을 찾아야할지 모르는 경우 점점 더 복잡한 관측을 이해하는 데 도움이 될 수 있습니다. "

이 접근 방식은 곡선 적합을 뛰어 넘습니다. 확인해 볼 가치가 있습니다.


감사합니다. 분석가의 개입없이 자동으로 클러스터를 찾는 것이 정확합니다. 내가하고 싶은 일을 위해 5000-15000 데이터 포인트의 데이터 세트를 클러스터로 분할해야합니다. 각 세트는 50000 개 정도의 데이터 세트 그룹에 대한 인간의 개입없이 간단한 수식 (반복 수식 포함)을 따르는 클러스터로 분할해야합니다. 가정용 컴퓨터 하드웨어를 사용하는 사람이
whybird

각 군집에 맞는 곡선은 어떤 방법 으로든 경계를 감지 한 후에는 다른 모델 (사인파, 다항식, 지수)을 시도하여 어느 것이 더 일반적인 r ^ 2를 제공하는지 알 수있을 정도로 간단합니다.
whybird

2
OK, 나는 잘못된 통신이 이것으로부터 발생한다고 생각합니다 : Sax와 ​​iSax는 시계열을 저장하고 처리하기위한 표현 형식이며, 클러스터링 또는 세그먼트 / 패턴 감지 알고리즘이 아닙니다 (OP의 게시물 당). 귀하의 답변에서 Keogh는 SAX 표현 형식을 기반으로하고 OP의 문제를 해결하는 알고리즘을 생각해 냈습니다. 그러나 나는 이것이 당신이 의미하는 것이 아니라고 생각합니까?
Zhubarb

2
좋아, Keogh에 연락 할 필요가 없습니다. iSaxSax 에 대해 알고 있습니다. 시계열의 효율적인 마이닝을위한 표현 형식입니다. 링크는 그것들을 설명합니다. iSax는 최신 버전입니다. 나는 당신의 대답에 대한 나의 오해에 흥분했기 때문에 질문 (페단하지 않으려 고 함) :).
바브

2
나는 아무것도 숨기려고하지 않았으며 'isax routine'을 isax에서 작동하는 알고리즘으로 해석했습니다. 귀하의 답변은 설명 후에 다시 단어를 수정 / 수정해야한다고 제안합니다.
바브

2

시계열에서 변화 지점을 탐지하려면 강력한 글로벌 ARIMA 모델을 구성하고 (귀하의 경우 시간이 지남에 따라 모델 변화 및 매개 변수 변경에 의해 분명히 결함이 있음) 해당 모델의 매개 변수에서 가장 중요한 변화 지점을 식별해야합니다. 509 값을 사용하는 가장 중요한 변경점은 약 353 년이었습니다. 저는 AUTOBOX (개발에 도움이 됨)에서 사용 가능한 일부 전용 알고리즘을 사용하여 사용자 지정 응용 프로그램에 라이센스를 부여 할 수있었습니다. 기본 아이디어는 데이터를 두 부분으로 분리하고 가장 중요한 변경 지점을 찾으면 두 시간 범위 각각을 개별적으로 다시 분석하여 (1-352; 353-509) 두 세트 내에서 추가 변경 지점을 결정하는 것입니다. k 개의 부분 집합이 나타날 때까지이 과정이 반복됩니다. 이 방법을 사용하여 첫 번째 단계를 첨부했습니다.여기에 이미지 설명을 입력하십시오

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


153과 173의 P- 값이 낮을 때 왜 353에 플래그가 표시됩니까?
Nick Cox

@NickCox 좋은 질문입니다! 위대한 의견 예측을 위해 전체 아이디어는 가장 최근의 (중요한) 부분 집합을 이전 부분 집합과 분리하는 것이므로 353 원은 ...입니다. 여기서 목적으로 실제로 173을 선택합니다.
IrishStat

제목 "MOST RECENT
SIGNIFICANT

감사합니다! 이것은 정말 흥미롭고 대단히 감사합니다. 자세한 내용은 연락을 드릴 것입니다.
whybird

설명 주셔서 감사합니다 : 아이디어는 실제로 마지막 주에 명시 적입니다. (우연히, 나는 1990 년대 초반부터 프로그램 출력에서 ​​많은 대문자를 보지 못했습니다. 의미가 있다고 가정 할 때 "95 % 신뢰 수준"을 "5 % 유의 수준"으로 변경하는 것이 좋습니다.)
Nick Cox

2

스레드의 제목이 잘못되었다고 생각합니다. 밀도 함수를 비교하지 않고 실제로 시계열에서 구조적 중단을 찾고 있습니다. 그러나 시계열의 전체 히스토리를보고 이러한 구조적 구분을 롤링 시간 창 또는 뒤늦은 곳에서 찾을 지 여부를 지정하지 않습니다. 이런 의미에서 귀하의 질문은 실제로 이것과 중복됩니다 : 시계열에서 구조적 중단을 감지하는 방법은 무엇입니까?

이 링크에서 Rob Hyndman이 언급했듯이 R은 이러한 목적으로 strucchange 패키지를 제공합니다. 나는 당신의 데이터를 가지고 놀았지만 결과가 실망 스럽습니다. [첫 번째 데이터 포인트가 실제로 4입니까 아니면 54이어야합니까?] :

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

패키지의 일반 사용자가 아닙니다. 보시다시피 데이터에 맞는 모델에 따라 다릅니다. 당신은 실험 할 수 있습니다

library(forecast)
auto.arima(raw)

가장 적합한 ARIMA 모델을 제공합니다.


감사합니다! 제목에서 '히스토그램'이라는 단어를 편집했습니다. 나는 처음에 그것을 잘못 사용했고, 주석에 대한 응답으로 이전 편집에서 본문에서 제목을 제거했을 때 제목을 편집하는 것을 잊었다.
whybird

내 데이터는 실제로 공간적으로 관련된 일련의 데이터이며 시간 기반이 아니며 일반적으로 직선이나 평면에 종종 충분하지 않습니다. 방법; 이전 검색에서 예상했던 답변을 찾지 못한 이유의 일부일 수 있습니다.
whybird

이 예제의 첫 번째 데이터 포인트는 실제로 4이지만, 이전 구조의 끝 부분에 닿았거나 노이즈 일 수 있습니다. 나는 그것을 이상치로 기꺼이 내버려 두었지만, 내가 생각해 낸 모든 시스템은 그런 것들에도 대처해야 할 것이다.
whybird

아, 그리고 분석은 뒷받침됩니다. 명확히하기 위해 질문을 편집하겠습니다.
whybird
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.