isoutlier
查找数据中的离群值
语法
说明
返回一个逻辑数组,当在 TF
= isoutlier(A
)A
的元素中检测到离群值时,该数组中与之对应的元素为 true
。
如果
A
是矩阵,则isoutlier
分别对A
的每列进行运算。如果
A
是多维数组,则isoutlier
沿A
的大小不等于 1 的第一个维度进行运算。如果
A
是表或时间表,则isoutlier
分别对A
的每个变量进行运算。
默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。
使用一个或多个名称-值参数指定用于检测离群值的其他参数。例如,TF
= isoutlier(___,Name,Value
)isoutlier(A,"SamplePoints",t)
相对于时间向量 t
中的对应元素检测数组 A
中的离群值。
示例
检测向量中的离群值
查找数据向量中的离群值。输出中的逻辑值 1 表示离群值的位置。
A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57]; TF = isoutlier(A)
TF = 1x15 logical array
0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
使用均值检测方法
将离群值定义为偏离均值三倍标准差以上的点,并查找离群值在向量中的位置。
A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
TF = isoutlier(A,"mean")
TF = 1x15 logical array
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
使用移窗检测法
使用移动检测方法来检测对应于时间向量的正弦波中的局部离群值。
创建包含一个局部离群值的数据向量。
x = -2*pi:0.1:2*pi; A = sin(x); A(47) = 0;
创建与 A
中的数据对应的时间向量。
t = datetime(2017,1,1,0,0,0) + hours(0:length(x)-1);
将离群值定义为滑动窗内与局部中位数相差超过三倍局部换算 MAD 的点。查找离群值在 A
中的位置,相对于 t
中的点,窗口大小为 5 个小时。绘制数据和检测到的离群值的图。
TF = isoutlier(A,"movmedian",hours(5),"SamplePoints",t); plot(t,A) hold on plot(t(TF),A(TF),"x") legend("Original Data","Outlier Data")
检测矩阵中的离群值
查找矩阵每一行的离群值。
创建一个数据矩阵,其对角线上包含离群值。
A = magic(5) + diag(200*ones(1,5))
A = 5×5
217 24 1 8 15
23 205 7 14 16
4 6 213 20 22
10 12 19 221 3
11 18 25 2 209
基于每行中的数据查找离群值的位置。
TF = isoutlier(A,2)
TF = 5x5 logical array
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
可视化离群值阈值
定位数据向量中的离群值,并可视化该离群值。
创建包含一个局部离群值的数据向量。
x = 1:10; A = [60 59 49 49 58 100 61 57 48 58];
使用默认检测方法 "median"
定位离群值。
[TF,L,U,C] = isoutlier(A);
绘制原始数据、离群值以及由检测方法确定的阈值和中心值。中心值是数据的中位数,上阈值和下阈值分别高于和低于中位数三倍换算 MAD。
plot(x,A) hold on plot(x(TF),A(TF),"x") yline([L U C],":",["Lower Threshold","Upper Threshold","Center Value"]) legend("Original Data","Outlier Data")
输入参数
A
— 输入数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
输入数据,指定为向量、矩阵、多维数组、表或时间表。
如果
A
是一个表,则其变量的类型必须为double
或single
,您也可以使用DataVariables
参数显式列出double
或single
变量。当您使用的表中包含double
和single
数据类型之外的变量时,指定变量很有用。如果
A
是一个时间表,则isoutlier
仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。
数据类型: double
| single
| table
| timetable
method
— 检测离群值的方法
"median"
(默认) | "mean"
| "quartiles"
| "grubbs"
| "gesd"
检测离群值的方法,指定为以下值之一。
方法 | 描述 |
---|---|
"median" | 离群值定义为与中位数相差超过三倍换算 MAD 的元素。换算 MAD 定义为 c*median(abs(A-median(A))) ,其中 c=-1/(sqrt(2)*erfcinv(3/2)) 。 |
"mean" | 离群值定义为与均值相差超过三倍标准差的元素。此方法比 "median" 快,但没有它可靠。 |
"quartiles" | 离群值定义为比上四分位数 (75%) 大 1.5 个四分位差以上或比下四分位数 (25%) 小 1.5 个四分位差以上的元素。当 A 中的数据不是正态分布时,此方法很有用。 |
"grubbs" | 使用针对离群值的 Grubbs 检验检测离群值,即基于假设检验每次迭代删除一个离群值。此方法假设 A 中的数据呈正态分布。 |
"gesd" | 使用广义极端 Student 化偏差检验检测离群值。此迭代方法与 "grubbs" 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。 |
threshold
— 百分位数阈值
二元素行向量
百分位数阈值,指定为元素在区间 [0, 100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。threshold
的第一个元素必须小于第二个元素。
例如,[10 90]
阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。
movmethod
— 移窗法
"movmedian"
| "movmean"
用来检测离群值的移窗法,指定为下列方法之一。
方法 | 描述 |
---|---|
"movmedian" | 离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 汉佩尔滤波器。 |
"movmean" | 离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。 |
window
— 窗长度
正整数标量 | 由正整数组成的二元素向量 | 正持续时间标量 | 由正持续时间组成的二元素向量
窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。
如果 window
是正整数标量,则窗口以当前元素为中心并且包含 window-1
个相邻元素。如果 window
是偶数,则窗口以当前元素和上一个元素为中心。
如果 window
是由正整数组成的二元素向量 [b f]
,则窗口包含当前元素、其之前的 b
个元素和之后的 f
个元素。
当 A
是时间表或者 SamplePoints
被指定为 datetime
或 duration
向量时,window
的类型必须是 duration
,而且将会基于样本点来计算窗口。
dim
— 运算维度
正整数标量
运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
以一个 m
×n
输入矩阵 A
为例:
isoutlier(A,1)
基于A
的每列中的数据检测离群值,并返回一个m
×n
矩阵。isoutlier(A,2)
基于A
的每行中的数据检测离群值,并返回一个m
×n
矩阵。
对于表或时间表输入数据,不支持 dim
,并且分别对每个表或时间表变量进行运算。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
示例: isoutlier(A,"mean",ThresholdFactor=4)
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: isoutlier(A,"mean","ThresholdFactor",4)
SamplePoints
— 样本点
向量 | 表变量名称 | 标量 | 函数句柄 | 表 vartype
下标
采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...]
是默认值。
当输入数据是表时,可以使用以下选项之一将采样点指定为表变量。
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
注意
当输入数据为 timetable
时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。
移动窗基于样本点进行定义。例如,如果 t
是与输入数据对应的时间向量,则 isoutlier(rand(1,10),"movmean",3,"SamplePoints",t)
将有一个代表 t(i)-1.5
和 t(i)+1.5
之间时间间隔的窗。
当样本点向量的数据类型为 datetime
或 duration
时,移动窗长度的类型必须为 duration
。
示例: isoutlier(A,"SamplePoints",0:0.1:10)
示例: isoutlier(T,"SamplePoints","Var1")
数据类型: single
| double
| datetime
| duration
DataVariables
— 要对其进行操作的表变量
表变量名称 | 标量 | 向量 | 元胞数组 | 模式 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。DataVariables
值指示要检查输入表中的哪些变量具有离群值。与指示的变量关联的数据类型必须为 double
或 single
。
对于 DataVariables
未指定的变量,第一个输出 TF
包含 false
,除非 OutputFormat
的值为 "tabular"
。
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
示例: isoutlier(T,"DataVariables",["Var1" "Var2" "Var4"])
OutputFormat
— 输出数据类型
"logical"
(默认) | "tabular"
输出数据类型,指定为下列值之一:
"logical"
- 对于表或时间表输入数据,以逻辑数组形式返回输出TF
。"tabular"
- 对于表输入数据,以表形式返回输出TF
。对于时间表输入数据,以时间表形式返回输出TF
。
对于向量、矩阵或多维数组输入数据,不支持 OutputFormat
。
示例: isoutlier(T,"OutputFormat","tabular")
ThresholdFactor
— 检测阈值因子
非负标量
检测阈值因子,指定为非负标量。
对于方法 "median"
和 "movmedian"
,检测阈值因子将代替换算 MAD 的倍数(默认为 3)。
对于方法 "mean"
和 "movmean"
,检测阈值因子将取代与均值相差的标准差个数(默认为 3)。
对于方法 "grubbs"
和 "gesd"
,检测阈值因子是 0 到 1 范围内的一个标量。值接近 0 会得到较少数目的离群值,值接近 1 则会得到较多数目的离群值。默认的检测阈值因子为 0.05。
对于 "quartiles"
方法,检测阈值因子将代替四分差的默认倍数(默认为 1.5)。
当指定的方法是 "percentiles"
时,不支持此名称-值参数。
MaxNumOutliers
— 最大离群值计数
正整数标量
最大离群值计数,仅适用于 "gesd"
方法,指定为正整数标量。MaxNumOutliers
值指定 "gesd"
方法返回的离群值的最大数目。例如,isoutlier(A,"gesd","MaxNumOutliers",5)
最多返回五个离群值。
MaxNumOutliers
的默认值是最接近 A
中的元素数的 10% 的整数。为离群值数上限设置较大的值,可以更可能检测到所有离群值,但代价是降低计算效率。
"gesd"
方法假定非离群值输入数据是从近似正态分布采样的。如果数据不是以这种方式采样的,则返回的离群值数量可能会超过 MaxNumOutliers
值。
输出参数
TF
— 离群值指示值
向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值指示符,以向量、矩阵、多维数组、表或时间表形式返回。
除非 OutputFormat
的值为 "tabular"
,否则 TF
与 A
的大小相同。如果 OutputFormat
的值为 "tabular"
,则 TF
只具有对应于指定的 DataVariables
的变量。
数据类型: logical
L
— 下阈值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的下阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的下阈值是比输入数据的中位数小三倍换算 MAD 的值。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,L
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 L
的大小与 A
相同。
数据类型: double
| single
| table
| timetable
U
— 上阈值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的上阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的上阈值是比输入数据的中位数大三倍换算 MAD 的值。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,U
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 U
的大小与 A
相同。
数据类型: double
| single
| table
| timetable
C
— 中心值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的中心值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,C
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 C
的大小与 A
相同。
数据类型: double
| single
| table
| timetable
详细信息
中位数绝对偏差
对于由 N 个标量观测值组成的有限长度向量 A,中位数绝对偏差 (MAD) 定义为
,其中 i = 1,2,...,N。
换算 MAD 定义为 c*median(abs(A-median(A)))
,其中 c=-1/(sqrt(2)*erfcinv(3/2))
。
参考
[1] NIST/SEMATECH e-Handbook of Statistical Methods, https://www.itl.nist.gov/div898/handbook/, 2013.
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持
"percentiles"
、"grubbs"
和"gesd"
方法。"movmedian"
和"movmean"
方法不支持 tall 时间表。不支持
SamplePoints
和MaxNumOutliers
名称-值参数。DataVariables
的值不能是函数句柄。只有 tall 列向量
A
支持沿第一个维度计算isoutlier(A)
、isoutlier(A,"median",...)
或isoutlier(A,"quartiles",...)
。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
用于检测离群值的
"movmean"
和"movmedian"
方法不支持时间表输入数据、日期时间SamplePoints
值或持续时间SamplePoints
值。字符串和字符数组输入必须是常量。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不支持
"movmedian"
移动方法。不支持
SamplePoints
和DataVariables
名称-值参数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2017a 中推出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)