ischange
查找数据中的突然变化
语法
说明
使用一个或多个名称-值参数指定用于计算变化点的其他参数。例如,TF
= ischange(___,Name,Value
)ischange(A,'MaxNumChanges',m)
最多检测到 m
个变化点。
示例
均值的变化
创建一个由含噪数据组成的向量,并计算数据均值的突然变化。
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')
线性区的变化
创建一个由含噪数据组成的向量,并计算数据的斜率和截距的突然变化。设置较大的检测阈值可减少由于噪声而检测到的变化点数。
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
输入参数
A
— 输入数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
输入数据,指定为向量、矩阵、多维数组、表或时间表。
数据类型: single
| double
| table
| timetable
method
— 变化检测方法
'mean'
(默认) | 'variance'
| 'linear'
更改检测方法,指定为下列值之一:
'mean'
- 计算数据均值的突然变化。'variance'
- 计算数据方差的突然变化。'linear'
- 计算数据的斜率和截距的突然变化。
dim
— 运算维度
正整数标量
运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
以一个 m
×n
输入矩阵 A
为例:
ischange(A,1)
基于A
的每列中的数据检测变化点,并返回一个m
×n
矩阵。ischange(A,2)
基于A
的每行中的数据检测变化点,并返回一个m
×n
矩阵。
对于表或时间表输入数据,不支持 dim
,并且分别对每个表或时间表变量进行运算。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: TF = ischange(A,'MaxNumChanges',5)
SamplePoints
— 样本点
向量 | 表变量名称 | 标量 | 函数句柄 | 表 vartype
下标
采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...]
是默认值。
当输入数据是表时,可以使用以下选项之一将采样点指定为表变量:
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
注意
当输入数据为 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
— 要对其进行操作的表变量
表变量名称 | 标量 | 向量 | 元胞数组 | 模式 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。DataVariables
值指示要检查输入表中哪些变量的变化点。与指示的变量关联的数据类型必须为 double
或 single
。
对于 DataVariables
未指定的变量,第一个输出 TF
包含 false
,除非 OutputFormat
的值为 'tabular'
。
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
示例: ischange(T,'DataVariables',["Var1" "Var2" "Var4"])
OutputFormat
— 输出数据类型
'logical'
(默认) | 'tabular'
输出数据类型,指定为下列值之一:
'logical'
- 对于表或时间表输入数据,以逻辑数组形式返回输出TF
。'tabular'
- 对于表输入数据,以表形式返回输出TF
。对于时间表输入数据,以时间表形式返回输出TF
。
对于向量、矩阵或多维数组输入数据,不支持 OutputFormat
。
示例: ischange(T,'OutputFormat','tabular')
Threshold
— 变化点阈值
1 (默认) | 非负标量
变化点阈值,指定为非负标量。增大阈值使其大于 1 将产生较少的变化点。
阈值确定检测到的变化点数,如果指定了 MaxNumChanges
,则不能指定阈值。
MaxNumChanges
— 最大变化点数
正整数标量
要检测的最大变化点数,指定为正整数标量。ischange
使用自动阈值以使计算的变化点数不超过指定数量,因此如果指定了 MaxNumChanges
,则不能指定 Threshold
。
输出参数
TF
— 变化点指示符
向量 | 矩阵 | 多维数组 | 表 | 时间表
变化点指示符,以向量、矩阵、多维数组、表或时间表形式返回。
除非 OutputFormat
的值为 'tabular'
,否则 TF
与 A
的大小相同。如果 OutputFormat
的值为 'tabular'
,则 TF
只具有对应于指定的 DataVariables
的变量。
数据类型: logical
S1
— 均值或斜率
向量 | 矩阵 | 多维数组 | 表 | 时间表
变化点之间的数据的均值或斜率,以向量、矩阵、多维数组、表或时间表形式返回。
如果变化点检测方法为
'mean'
或'variance'
,则S1
包含每个线段的均值。如果方法为
'linear'
,则S1
包含每个线段的斜率。
S1
与输入数据的类型相同。
数据类型: double
| single
| table
| timetable
S2
— 方差或截距
向量 | 矩阵 | 多维数组 | 表 | 时间表
变化点之间的数据的方差或截距,以向量、矩阵、多维数组、表或时间表形式返回。
如果变化点检测方法为
'mean'
或'variance'
,则S2
包含每个线段的方差。如果方法为
'linear'
,则S2
包含每个线段的截距。
S2
与输入数据的类型相同。
数据类型: double
| single
| table
| timetable
详细信息
变化点
数据向量 A 如果可以分成两段 A1 和 A2,并满足以下条件,则包含一个变化点:
是由 Threshold
参数指定的阈值,C 表示代价函数。
例如,用于检测均值中的突然变化的代价函数是 ,其中 N 是向量 x 中的元素数。代价函数测量线段均值逼近该线段的程度。
ischange
以迭代方式使代价函数的总和最小化,以确定变化点 k 的数量和位置,使得
参考
[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.
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
不支持
OutputFormat
名称-值参数。对于单精度输入,生成代码的输出可能与 MATLAB® 输出不匹配。原因在于为
ischange
生成的代码以单精度执行大多数中间计算。DataVariables
不能包含重复的变量名称。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2017b 中推出R2022a: 返回包含逻辑输出的表或时间表
对于表或时间表输入数据,通过将 OutputFormat
名称-值参数设置为 'tabular'
,可以返回表输出 TF
而不是逻辑数组。
R2021b: 将采样点指定为表变量
对于表输入数据,可以使用 SamplePoints
名称-值参数将采样点指定为表变量。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)