Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ischange

データの急激な変化の検出

説明

TF = ischange(A) は logical 配列を返します。この配列の要素は、A の対応する要素の平均値に急激な変化があった場合に logical 1 (true) となります。

ischange の機能を対話的に使用するには、ライブ スクリプトに [変化点の検出] タスクを追加します。

TF = ischange(A,method) は、データの変化点を定義する方法を指定します。たとえば、ischange(A,'variance')A の要素の分散の急激な変化を検出します。

TF = ischange(___,dim) は、上記の構文のいずれかで動作する A の次元を指定します。たとえば、ischange(A,2) は行列 A の各行の変化点を計算します。

TF = ischange(___,Name,Value) は、名前と値の引数を 1 つ以上使用して、変化点を検出するための追加のパラメーターを指定します。たとえば、ischange(A,'MaxNumChanges',m)m 個以下の変化点を検出します。

[TF,S1] = ischange(___) は変化点間のライン セグメントに関する情報も返します。たとえば、[TF,S1] = ischange(A) はベクトル A の変化点間におけるデータの平均値を含むベクトル S1 を返します。

[TF,S1,S2] = ischange(___) は変化点間のライン セグメントに関する追加情報を返します。たとえば、[TF,S1,S2] = ischange(A) は各セグメントの平均値を含むベクトル S1 と、ベクトル A の各セグメントの分散を含むベクトル S2 を返します。

すべて折りたたむ

ノイズを含むデータのベクトルを作成し、データの平均値の急激な変化を計算します。

A = [ones(1,5) 25*ones(1,5) 50*ones(1,5)] + rand(1,15);
TF = ischange(A)
TF = 1x15 logical array

   0   0   0   0   0   1   0   0   0   0   1   0   0   0   0

変化点間のデータの平均値を計算するには、2 番目の出力引数を指定します。

[TF,S1] = ischange(A);
plot(A,'*')
hold on
stairs(S1)
legend('Data','Segment Mean','Location','NW')

ノイズを含むデータのベクトルを作成し、データの勾配と切片の急激な変化を計算します。検出しきい値を大きく設定すると、ノイズが原因で検出される変化点の数が少なくなります。

A = [zeros(1,100) 1:100 99:-1:50  50*ones(1,250)] + 10*rand(1,500);
[TF,S1,S2] = ischange(A,'linear','Threshold',200);
segline = S1.*(1:500) + S2;
plot(1:500,A,1:500,segline)              
legend('Data','Linear Regime')

しきい値を指定する代わりに、検出する変化点の最大数を指定することもできます。

[TF,S1,S2] = ischange(A,'linear','MaxNumChanges',3);

行列の各行について、平均値の急激な変化を計算します。

A = diag(25*ones(5,1)) + rand(5,5)
A = 5×5

   25.8147    0.0975    0.1576    0.1419    0.6557
    0.9058   25.2785    0.9706    0.4218    0.0357
    0.1270    0.5469   25.9572    0.9157    0.8491
    0.9134    0.9575    0.4854   25.7922    0.9340
    0.6324    0.9649    0.8003    0.9595   25.6787

TF = ischange(A,2)
TF = 5x5 logical array

   0   1   0   0   0
   0   1   1   0   0
   0   0   1   1   0
   0   0   0   1   1
   0   0   0   0   1

入力引数

すべて折りたたむ

入力データ。ベクトル、行列、多次元配列、table または timetable として指定します。

データ型: single | double | table | timetable

変化検出メソッド。次の値のいずれかとして指定します。

  • 'mean' — データの平均値の急激な変化を検出。

  • 'variance' — データの分散の急激な変化を検出。

  • 'linear' — データの勾配と切片の急激な変化を検出。

操作次元。正の整数スカラーとして指定します。値を指定しない場合、既定値は、サイズが 1 ではない最初の配列の次元です。

mn 列の入力行列 A を考えます。

  • ischange(A,1) は、A の各列のデータに基づいて変化点を検出し、mn 列の行列を返します。

    ischange(A,1) column-wise operation

  • ischange(A,2) は、A の各行のデータに基づいて変化点を検出し、mn 列の行列を返します。

    ischange(A,2) row-wise operation

入力データが table または timetable の場合、dim はサポートされず、演算は各 table 変数または timetable 変数に沿って個別に行われます。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: TF = ischange(A,'MaxNumChanges',5)

データ オプション

すべて折りたたむ

サンプル点。サンプル点のベクトル、または次の表のいずれかのオプション (入力データが table の場合) として指定します。サンプル点はデータの x 軸の位置を表し、並べ替える必要があり、一意の要素を含まなければなりません。サンプル点は等間隔でサンプリングされている必要はありません。既定の設定はベクトル [1 2 3 ...] です。

入力データが table の場合は、次のいずれかのオプションを使用して、サンプル点を table 変数として指定できます。

インデックス方式

変数名:

  • string スカラーまたは文字ベクトル

  • "A" または 'A'A という名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [false false true] — 3 番目の変数

関数ハンドル:

  • 入力として table 変数をとり、logical スカラーを返す関数ハンドル

  • @isnumeric — 数値を含んでいる 1 つの変数

変数の型:

  • 指定した型の 1 つの変数を選択する vartype 添字

  • vartype("numeric") — 数値を含んでいる 1 つの変数

メモ

入力データが timetable の場合、この名前と値の引数はサポートされません。timetable では、行時間のベクトルをサンプル点として使用します。別のサンプル点を使用するには、目的のサンプル点が行時間に含まれるように timetable を編集しなければなりません。

例: ischange([1 2 3 4 5 6],'linear','SamplePoints',[1 2 3 10 20 30])

例: ischange(T,'linear','SamplePoints',"Var1")

データ型: single | double | datetime | duration

演算の対象とする table 変数。次の表のオプションのいずれかとして指定します。DataVariables の値は、入力 table 内の変化点を調べる変数を示します。指摘された変数に関連付けられるデータ型は double または single でなければなりません。

最初の出力 TF には、DataVariables で指定されていない変数については false が格納されます。ただし、OutputFormat の値が 'tabular' の場合を除きます。

インデックス方式

変数名:

  • string または文字ベクトル

  • string 配列または文字ベクトルの cell 配列

  • pattern オブジェクト

  • "A" または 'A'A という名前の変数

  • ["A" "B"] または {'A','B'}A および B という名前の 2 つの変数

  • "Var"+digitsPattern(1)"Var" の後に数字 1 桁が続く名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • 数値のベクトル

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [2 3] — table の 2 番目と 3 番目の変数

  • [false false true] — 3 番目の変数

関数ハンドル:

  • 入力として table 変数をとり、logical スカラーを返す関数ハンドル

  • @isnumeric — 数値を含んでいるすべての変数

変数の型:

  • 指定した型の変数を選択する vartype 添字

  • vartype("numeric") — 数値を含んでいるすべての変数

例: ischange(T,'DataVariables',["Var1" "Var2" "Var4"])

出力データ型。次の値のいずれかとして指定します。

  • 'logical' — 入力データが table または timetable の場合、出力 TF を logical 配列として返します。

  • 'tabular' — 入力データが table の場合、出力 TF を table として返します。入力データが timetable の場合、出力 TF を timetable として返します。

入力データがベクトル、行列、または多次元配列の場合、OutputFormat はサポートされません。

例: ischange(T,'OutputFormat','tabular')

変化点オプション

すべて折りたたむ

変化点のしきい値。非負のスカラーとして指定します。このしきい値を 1 より大きい値にすると、変化点が少なくなります。

このしきい値は、検出する変化点の数を決定しますが、MaxNumChanges が指定されている場合には指定できません。

検出する変化点の最大数。正の整数スカラーとして指定します。ischange は指定した値以内の数の変化点を計算する自動しきい値を使用するため、MaxNumChanges が指定されている場合は Threshold を指定できません。

出力引数

すべて折りたたむ

変化点インジケーター。ベクトル、行列、多次元配列、table または timetable として返されます。

TF は、OutputFormat の値が 'tabular' の場合を除き、A と同じサイズになります。OutputFormat の値が 'tabular' の場合、TF は、指定された DataVariables に対応する変数のみをもちます。

データ型: logical

変化点間のデータの平均値または勾配。ベクトル、行列、多次元配列、table、timetable のいずれかとして返されます。

  • 変化点検出メソッドが 'mean' または 'variance' の場合、S1 には各セグメントの平均値が含まれます。

  • メソッドが 'linear' の場合、S1 には各セグメントの勾配が含まれます。

S1 のデータ型は入力データと同じです。

データ型: double | single | table | timetable

変化点間のデータの分散または切片。ベクトル、行列、多次元配列、table または timetable として返されます。

  • 変化点検出メソッドが 'mean' または 'variance' の場合、S2 には各セグメントの分散が含まれます。

  • メソッドが 'linear' の場合、S2 には各セグメントの切片が含まれます。

S2 のデータ型は入力データと同じです。

データ型: double | single | table | timetable

アルゴリズム

データのベクトル A を、次の式を満たすように A1A2 の 2 つのセグメントに分割できる場合、このベクトルには変化点が含まれています。

C(A1)+C(A2)+τ<C(A).

τThreshold パラメーターで指定されたしきい値で、C はコスト関数を表します。

たとえば、平均値の急激な変化を検出するコスト関数は C(x)=Nvar(x) です。ここで、N はベクトル x の要素数です。コスト関数は、セグメントが平均値によりどの程度近似されているかを測定します。

ischange はコスト関数の合計を繰り返し最小化し、次の式を満たす変化点の数 k とその場所を判定します。

C(A1)+C(A2)+...+C(Ak)+kτ<C(A).

代替機能

ライブ エディター タスク

ischange の機能を対話的に使用するには、ライブ スクリプトに [変化点の検出] タスクを追加します。

Find Change Points task in the Live Editor

参照

[1] Killick R., P. Fearnhead, and I.A. Eckley. "Optimal detection of changepoints with a linear computational cost." Journal of the American Statistical Association. Vol. 107, Number 500, 2012, pp.1590-1598.

拡張機能

バージョン履歴

R2017b で導入

すべて展開する

参考

関数

ライブ エディター タスク