Main Content

ischange

查找数据中的突然变化

说明

示例

TF = ischange(A) 返回一个逻辑数组,当 A 的对应元素的均值出现突然变化时,该逻辑数组的元素为逻辑值 1 (true)。

示例

TF = ischange(A,method) 指定如何定义数据中的变化点。例如,ischange(A,'variance') 将计算 A 的元素方差的突然变化。

示例

TF = ischange(___,dim) 为上述任一语法指定 A 的运算维度。例如,ischange(A,2) 计算矩阵 A 的每一行的变化点。

示例

TF = ischange(___,Name,Value) 使用一个或多个名称-值参数指定用于计算变化点的其他参数。例如,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

要计算变化点之间数据的均值,请指定第二个输出参数。

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

Figure contains an axes object. The axes object contains 2 objects of type line, stair. One or more of the lines displays its values using only markers These objects represent Data, Segment Mean.

创建一个由含噪数据组成的向量,并计算数据的斜率和截距的突然变化。设置较大的检测阈值可减少由于噪声而检测到的变化点数。

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')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent 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

输入参数

全部折叠

输入数据,指定为向量、矩阵、多维数组、表或时间表。

数据类型: single | double | table | timetable

更改检测方法,指定为下列值之一:

  • 'mean' - 计算数据均值的突然变化。

  • 'variance' - 计算数据方差的突然变化。

  • 'linear' - 计算数据的斜率和截距的突然变化。

运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。

以一个 m×n 输入矩阵 A 为例:

  • ischange(A,1) 基于 A 的每列中的数据检测变化点,并返回一个 m×n 矩阵。

    ischange(A,1) column-wise operation

  • ischange(A,2) 基于 A 的每行中的数据检测变化点,并返回一个 m×n 矩阵。

    ischange(A,2) row-wise operation

对于表或时间表输入数据,不支持 dim,并且分别对每个表或时间表变量进行运算。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

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

数据选项

全部折叠

采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...] 是默认值。

当输入数据是表时,可以使用以下选项之一将采样点指定为表变量:

索引方案示例

变量名称:

  • 字符串标量或字符向量

  • "A"'A' - 名为 A 的变量

变量索引:

  • 引用变量在表中位置的索引编号

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 一个包含数值的变量

变量类型:

  • vartype 下标,用于选择一个指定类型的变量

  • vartype("numeric") - 一个包含数值的变量

注意

当输入数据为 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

要对其进行操作的表变量,指定为下表中的选项之一。DataVariables 值指示要检查输入表中哪些变量的变化点。与指示的变量关联的数据类型必须为 doublesingle

对于 DataVariables 未指定的变量,第一个输出 TF 包含 false,除非 OutputFormat 的值为 'tabular'

索引方案示例

变量名称:

  • 字符串、字符向量或元胞数组

  • pattern 对象

  • "A"'A' - 名为 A 的变量

  • ["A","B"]{'A','B'} - 两个名为 AB 的变量

  • "Var"+digitsPattern(1) - 变量名为 "Var" 后跟一个数字

变量索引:

  • 引用变量在表中位置的索引编号

  • 由数字组成的向量

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [2 3] - 表中的第二个和第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 所有包含数值的变量

变量类型:

  • vartype 下标,用于选择指定类型的变量

  • vartype("numeric") - 所有包含数值的变量

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

输出数据类型,指定为下列值之一:

  • 'logical' - 对于表或时间表输入数据,以逻辑数组形式返回输出 TF

  • 'tabular' - 对于表输入数据,以表形式返回输出 TF。对于时间表输入数据,以时间表形式返回输出 TF

对于向量、矩阵或多维数组输入数据,不支持 OutputFormat

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

变化点选项

全部折叠

变化点阈值,指定为非负标量。增大阈值使其大于 1 将产生较少的变化点。

阈值确定检测到的变化点数,如果指定了 MaxNumChanges,则不能指定阈值。

要检测的最大变化点数,指定为正整数标量。ischange 使用自动阈值以使计算的变化点数不超过指定数量,因此如果指定了 MaxNumChanges,则不能指定 Threshold

输出参数

全部折叠

变化点指示符,以向量、矩阵、多维数组、表或时间表形式返回。

除非 OutputFormat 的值为 'tabular',否则 TFA 的大小相同。如果 OutputFormat 的值为 'tabular',则 TF 只具有对应于指定的 DataVariables 的变量。

数据类型: logical

变化点之间的数据的均值或斜率,以向量、矩阵、多维数组、表或时间表形式返回。

  • 如果变化点检测方法为 'mean''variance',则 S1 包含每个线段的均值。

  • 如果方法为 'linear',则 S1 包含每个线段的斜率。

S1 与输入数据的类型相同。

数据类型: double | single | table | timetable

变化点之间的数据的方差或截距,以向量、矩阵、多维数组、表或时间表形式返回。

  • 如果变化点检测方法为 'mean''variance',则 S2 包含每个线段的方差。

  • 如果方法为 'linear',则 S2 包含每个线段的截距。

S2 与输入数据的类型相同。

数据类型: double | single | table | timetable

算法

数据向量 A 如果可以分成两段 A1 和 A2,并满足以下条件,则包含一个变化点:

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).

参考

[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 中推出

全部展开

另请参阅

函数

实时编辑器任务