Main Content

isoutlier

查找数据中的离群值

说明

示例

TF = isoutlier(A) 返回一个逻辑数组,当在 A 的元素中检测到离群值时,该数组中与之对应的元素为 true

  • 如果 A 是矩阵,则 isoutlier 分别对 A 的每列进行运算。

  • 如果 A 是多维数组,则 isoutlier 沿 A 的大小不等于 1 的第一个维度进行运算。

  • 如果 A 是表或时间表,则 isoutlier 分别对 A 的每个变量进行运算。

默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。

示例

TF = isoutlier(A,method) 指定检测离群值的方法。例如,isoutlier(A,"mean") 对偏离均值超过三倍标准差的所有元素返回 true

TF = isoutlier(A,"percentiles",threshold) 将离群值定义为 threshold 所指定的百分位数以外的点。threshold 参数是包含上下百分位数阈值的二元素行向量,例如 [10 90]

示例

TF = isoutlier(A,movmethod,window) 使用窗长度为 window 的移动窗方法检测局部离群值。例如,isoutlier(A,"movmedian",5) 对一个包含五个元素的窗口内偏离局部中位数超过三倍局部换算 MAD 的所有元素返回 true

示例

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

示例

TF = isoutlier(___,Name,Value) 使用一个或多个名称-值参数指定用于检测离群值的其他参数。例如,isoutlier(A,"SamplePoints",t) 相对于时间向量 t 中的对应元素检测数组 A 中的离群值。

示例

[TF,L,U,C] = isoutlier(___) 还返回离群值检测方法使用的下阈值 L、上阈值 U 和中心值 C

示例

全部折叠

查找数据向量中的离群值。输出中的逻辑值 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")

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

Figure contains an axes object. The axes object contains 5 objects of type line, constantline. These objects represent Original Data, Outlier Data.

输入参数

全部折叠

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

  • 如果 A 是一个表,则其变量的类型必须为 doublesingle,您也可以使用 DataVariables 参数显式列出 doublesingle 变量。当您使用的表中包含 doublesingle 数据类型之外的变量时,指定变量很有用。

  • 如果 A 是一个时间表,则 isoutlier 仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。

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

检测离群值的方法,指定为以下值之一。

方法描述
"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" 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。

百分位数阈值,指定为元素在区间 [0, 100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。threshold 的第一个元素必须小于第二个元素。

例如,[10 90] 阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。

用来检测离群值的移窗法,指定为下列方法之一。

方法描述
"movmedian"离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 Hampel 滤波器
"movmean"离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。

窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。

如果 window 是正整数标量,则窗口以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗口以当前元素和上一个元素为中心。

如果 window 是由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。

A 是时间表或者 SamplePoints 被指定为 datetimeduration 向量时,window 的类型必须是 duration,而且将会基于样本点来计算窗口。

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

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

  • isoutlier(A,1) 基于 A 的每列中的数据检测离群值,并返回一个 m×n 矩阵。

    isoutlier(A,1) column-wise operation

  • isoutlier(A,2) 基于 A 的每行中的数据检测离群值,并返回一个 m×n 矩阵。

    isoutlier(A,2) row-wise operation

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

名称-值参数

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

示例: isoutlier(A,"mean",ThresholdFactor=4)

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

示例: isoutlier(A,"mean","ThresholdFactor",4)

数据选项

全部折叠

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

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

表输入的选项描述示例
变量名称

指定单个表变量名称的字符向量或标量字符串

'Var1'

"Var1"

标量变量索引

标量表变量索引

3

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 将对应的变量指定为采样点,所有其他元素为 false

[true false false]

函数句柄

函数句柄,以表变量作为输入并返回逻辑标量,对于仅一个表变量,该标量必须为 true

@isnumeric

vartype 下标

vartype 函数生成的表下标,该函数只返回一个变量的一个下标

vartype('numeric')

注意

当输入数据为 timetable 时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。

移动窗基于样本点进行定义。例如,如果 t 是与输入数据对应的时间向量,则 isoutlier(rand(1,10),"movmean",3,"SamplePoints",t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗。

当样本点向量的数据类型为 datetimeduration 时,移动窗长度的类型必须为 duration

示例: isoutlier(A,"SamplePoints",0:0.1:10)

示例: isoutlier(T,"SamplePoints","Var1")

数据类型: single | double | datetime | duration

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

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

选项描述示例
变量名称

指定单个表变量名称的字符向量或字符串标量

'Var1'

"Var1"

变量名称的向量

字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

{'Var1' 'Var2'}

["Var1" "Var2"]

变量索引的标量或向量

表变量索引的标量或向量

1

[1 3 5]

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

[true false true]

函数句柄

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

@isnumeric

vartype 下标

vartype 函数生成的表下标

vartype("numeric")

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

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

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

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

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

示例: isoutlier(T,"OutputFormat","tabular")

离群值检测选项

全部折叠

检测阈值因子,指定为非负标量。

对于方法 "median""movmedian",检测阈值因子将代替换算 MAD 的倍数(默认为 3)。

对于方法 "mean""movmean",检测阈值因子将取代与均值相差的标准差个数(默认为 3)。

对于方法 "grubbs""gesd",检测阈值因子是 0 到 1 范围内的一个标量。值接近 0 会得到较少数目的离群值,值接近 1 则会得到较多数目的离群值。默认的检测阈值因子为 0.05。

对于 "quartiles" 方法,检测阈值因子将代替四分差的默认倍数(默认为 1.5)。

当指定的方法是 "percentiles" 时,不支持此名称-值参数。

最大离群值计数,仅适用于 "gesd" 方法,指定为正整数标量。MaxNumOutliers 值指定 "gesd" 方法返回的离群值的最大数目。例如,isoutlier(A,"gesd","MaxNumOutliers",5) 最多返回五个离群值。

MaxNumOutliers 的默认值是最接近 A 中的元素数的 10% 的整数。为离群值数上限设置较大的值,可以更可能检测到所有离群值,但代价是降低计算效率。

"gesd" 方法假定非离群值输入数据是从近似正态分布采样的。如果数据不是以这种方式采样的,则返回的离群值数量可能会超过 MaxNumOutliers 值。

输出参数

全部折叠

离群值指示符,以向量、矩阵、多维数组、表或时间表形式返回。

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

数据类型: logical

离群值检测方法使用的下阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的下阈值是比输入数据中位数小三倍换算 MAD 的值。除了在运算维度上的长度为 1 外,L 在其他所有维度上的大小均与 A 相同。

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

离群值检测方法使用的上阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的上阈值是比输入数据中位数大三倍换算 MAD 的值。除了在运算维度上的长度为 1 外,U 在其他所有维度上的大小均与 A 相同。

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

离群值检测方法使用的中心值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。除了在运算维度上的长度为 1 外,C 在其他所有维度上的大小均与 A 相同。

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

详细信息

全部折叠

中位数绝对偏差

对于由 N 个标量观测值组成的有限长度向量 A,中位数绝对偏差 (MAD) 定义为

MAD = median(|Aimedian(A)|)

,其中 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.

扩展功能

版本历史记录

在 R2017a 中推出

全部展开