データ系列のセグメントをプログラムで検出して、異なる曲線に合わせるにはどうすればよいですか?


14

特定のデータセットのセクションを最適な曲線に分割するための文書化されたアルゴリズムはありますか?

たとえば、このデータチャートを見るほとんどの人間は、それを3つの部分に容易に分割します:正弦波セグメント、線形セグメント、および逆指数セグメント。実際、私はこの特定のものを正弦波、直線、および単純な指数公式で作成しました。

3つの異なる部分が表示されるデータのグラフ

そのような部品を見つけるための既存のアルゴリズムはありますか?その後、さまざまな曲線/線に個別に適合させて、データのサブセットの最適な種類の複合シリーズを作成できますか?

この例では、セグメントの両端がほぼ並んでいますが、必ずしもそうではないことに注意してください。セグメントのカットオフで値が突然揺れることもあります。おそらく、それらのケースは検出しやすいでしょう。

更新:これは、実世界のデータの小さな画像です: 実世界チャート

更新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

ここでは、いくつかの既知の実世界の要素のエッジの近似位置を点線で示してグラフ化していますが、これは通常はあり得ない贅沢です。

ここに画像の説明を入力してください

しかし、私たちが持っている贅沢の1つは後知恵です。私の場合のデータは時系列ではなく、空間的に関連しています。データセット全体(通常は5000〜15000データポイント)を一度に分析するのが理にかなっており、継続的な方法ではありません。


1
ps CVへの最初の投稿。私はソフトウェア開発者であり、通常はもっと多くのことを考えています。地元のタブーに違反したことをおApびします。私の答えの検索の多くはここにつながっていたので、ここが質問するのに最適だと思いました。
whybird

データを投稿してみてください。例を挙げて質問に答えてみます。
IrishStat

1つの可能性は、メタモデルを使用して、曲線のファミリー全体を一度に適合させることです。物事をより正確にするために、KDEを使用するなど、最終的な目的がそのヒストグラムを平滑化することだとします。次に、カーネルの幅が次の値の範囲で変化することが許可されているモデルを使用すると、KDEからのスムーズな推定がより正確になります。使用したモデルのように(3) -ここでは、方程式(2)バツ
user603

1
あなたはアイデアが理にかなっているように例を構築しました:これまでのところ、とても良いです。実際のヒストグラムでは、複雑な形状が重なり合った分布の混合を反映することがはるかに一般的です。その場合、観察されたヒストグラムの変化点には関心がありません。これは一般に説得力がないか、混合について考える正しい方法ではありません。ただし、頻度または確率分布(のみ)の棒グラフを意味する統計科学の標準よりもはるかに広範な方法で「ヒストグラム」を使用している可能性があります。
ニックコックス

@IrishStat-通常のデータセットには5000〜15000のエントリがあります。ここで要約された実際のものを準備しようとしていましたが、それは悪い例であることが判明し、最初からやり直す必要がありました。一方、それを行うと、最初にパターンを探すためのデータの塊を単純に平滑化して平均化するという点で、私に部分的な答えが示唆されました。後で細かくなりますので、そのために感謝します:)良いように見えます。できるときに質問に追加します。
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データポイントのデータセットをクラスターに分割し、それぞれが簡単な式(反復式を含む)に適合するようにする必要があります国内のコンピューターハードウェア上の人間によって。
whybird

各クラスターに適合する曲線については、何らかの方法で境界を検出したら、単純に異なるモデル(正弦波、多項式、指数)を試して、どちらがより良い通常のr ^ 2を与えるかを確認するだけです。
whybird

2
OK、私はこれから誤解が生じると思います:SaxとiSaxは時系列を保存および処理するための表現形式であり、クラスタリングまたはセグメント/パターン検出アルゴリズムではありません(OPの投稿による)。あなたの答えからの私の理解は、KeoghがSAX表現形式に基づいたアルゴリズムを思いつき、たまたまOPの問題に対処しているということでした。しかし、これはあなたが意図したものではないと思いますか?
ジュバル

2
OK、Keoghに連絡する必要はありません。iSaxSaxについて知っています。これらは時系列を効率的にマイニングするための表現形式です。リンクはそれらを説明します。iSaxは新しいバージョンです。私はあなたの答えの誤解に興奮していたので、質問は(舌になろうとしないで):)。
ジュバル

2
私は何も隠そうとしていませんでした。「isaxルーチン」をisaxで動作するアルゴリズムとして解釈しました。明確化後、回答の言い回しや修正が必要であることをお勧めします。
ジュバル

2

時系列の変化点を検出するには、堅牢なグローバルARIMAモデル(モデルの経時変化とパラメーターの変化による確かな欠陥)を構築し、そのモデルのパラメーターの最も重要な変化点を特定する必要があります。509の値を使用すると、最も重要な変化点は期間353頃でした。AUTOBOXで利用可能な独自のアルゴリズム(開発を支援しました)を使用しました。基本的な考え方は、データを2つの部分に分け、最も重要な変化点を見つけたら、2つの時間範囲のそれぞれを個別に再分析し(1-352; 353-509)、2つのセットのそれぞれのさらなる変化点を決定することです。これは、サブセットがk個になるまで繰り返されます。このアプローチを使用して、最初のステップを添付しました。ここに画像の説明を入力してください

ここに画像の説明を入力してください


153と173のP値が低い場合、353がフラグを立てるのはなぜですか?
ニックコックス

@NickCoxいい質問です!すばらしいコメント予測のために、全体のアイデアは、最新の(重要な)サブセットを古いサブセットから分離することです。そのため、353が勝ちました。ここでは、実際に173を選択します。
IrishStat

タイトル「
最も最近の重要な

ありがとうございました!これは本当に興味深く、とても感謝しています。詳細については、ご連絡させていただく場合があります。
-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モデルが得られます。


ありがとうございました!タイトルから「ヒストグラム」という単語を編集しました。最初は誤ってそれをusudしていましたが、コメントに応じて以前の編集で本文からタイトルを削除したときに、タイトルを編集するのを忘れていました。
whybird

私のデータは実際には空間的に関連する一連のデータであり、時間ベースではなく、通常は十分な頻度で直線上または平面上にも存在しません-しかし、あなたはいくつかの基本的なレベルで同じと考えることができることは正しいです仕方; これが、以前の検索で期待していた答えが見つからなかった理由の一部であると思われます。
whybird

この例の最初のデータポイントは実際には4ですが、たまたま以前の構造の最後に到達したか、ノイズだった可能性があります。外れ値として除外してもかまいませんが、どのようなシステムを考え出しても、そのようなことに対処する必要があります。
whybird

ああ、そして分析は後知恵です。質問を編集して明確にします。
whybird
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.