Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

isoutlier

查找数据中的离群值

说明

示例

TF = isoutlier(A) 返回一个逻辑数组,当在 A 的元素中检测到离群值时,该数组中与之对应的元素为 true。默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。如果 A 是矩阵或表,则 isoutlier 分别对每一列进行运算。如果 A 是多维数组,则 isoutlier 沿大小不等于 1 的第一个维度进行运算。

示例

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 的维度 dim 运算。例如,isoutlier(A,2) 沿矩阵 A 的每一行运算。

示例

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

示例

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

示例

全部折叠

查找数据向量中的离群值。输出中的逻辑值 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,t(TF),A(TF),'x')
legend('Data','Outlier')

查找矩阵每一行的离群值。

创建一个数据矩阵,其对角线上包含离群值。

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

创建一个包含离群值的数据向量。查找并绘制离群值的位置以及由离群值方法确定的阈值和中心值。中心值是数据的中位数,上阈值和下阈值分别高于和低于中位数三倍换算 MAD。

x = 1:10;
A = [60 59 49 49 58 100 61 57 48 58];
[TF,L,U,C] = isoutlier(A);
plot(x,A,x(TF),A(TF),'x',x,L*ones(1,10),x,U*ones(1,10),x,C*ones(1,10))
legend('Original Data','Outlier','Lower Threshold','Upper Threshold','Center Value')

输入参数

全部折叠

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

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

如果 A 是一个时间表,则 isoutlier 仅对表元素进行运算。行时间必须是唯一的并按升序列出。

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

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

方法说明
'median'对偏离中位数超过三倍换算 MAD 的元素返回 true。换算 MAD 定义为 c*median(abs(A-median(A))),其中 c=-1/(sqrt(2)*erfcinv(3/2))
'mean'对偏离均值超过三倍标准差的元素返回 true。此方法比 'median' 快,但没有它可靠。
'quartiles'对高于上四分位数或低于下四分位数超过 1.5 个四分位范围的元素返回 true。当 A 中的数据不是正态分布时,此方法很有用。
'grubbs'应用 Grubbs 检验以检测离群值,即基于假设检验每次迭代删除一个离群值。此方法假设 A 中的数据呈正态分布。
'gesd'应用广义极端 Student 化偏差检验检测离群值。此迭代方法与 'grubbs' 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。

百分位数阈值,指定为元素在区间 [0,100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。例如,[10 90] 阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。threshold 的第一个元素必须小于第二个元素。

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

方法说明
'movmedian'对在 window 指定的窗口长度内偏离局部中位数超过三倍局部换算 MAD 的元素返回 true
'movmean'对在 window 指定的窗口长度内偏离局部中值超过三个局部标准差的元素返回 true

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

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

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

A 是时间表或 'SamplePoints' 指定为 datetimeduration 向量时,window 的类型必须为 duration,并会相对于样本点来计算窗口。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | duration

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

假设有一个矩阵 A

isoutlier(A,1) 基于 A 中每一列的数据检测离群值。

isoutlier(A,2) 基于 A 中每一行的数据检测离群值。

A 为表或时间表时,不支持 dimisoutlier 分别对每个表或时间表变量进行运算。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

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

检测阈值系数,指定为以逗号分隔的对组,其中包含 'ThresholdFactor' 和一个非负标量。

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

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

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

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

当指定的方法是 'percentiles' 时,不支持此名称-值对组。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

样本点,指定为逗号分隔的对组,其中包含 'SamplePoints' 和一个向量。样本点表示数据在 A 中的位置。样本点不需要均匀采样。默认情况下,样本点向量是 [1 2 3 ...]

移动窗口相对于样本点定义,样本点必须已排序并且包含唯一的元素。例如,如果 t 是与输入数据对应的时间向量,则 isoutlier(rand(1,10),'movmean',3,'SamplePoints',t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗口。

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

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

表变量,指定为逗号分隔的对组,包含 'DataVariables' 和变量名称、变量名称元胞数组、数值向量、逻辑向量、函数句柄或表 vartype 下标。'DataVariables' 值表示要在输入表的哪些列中检测离群值,可以是下列值之一:

  • 指定单个表变量名称的字符向量

  • 字符向量元胞数组,其中每个元素都是表变量名称

  • 表变量索引向量

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

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

  • vartype 下标

与指示的变量关联的数据类型必须为 doublesingle

示例: 'Age'

示例: {'Height','Weight'}

示例: @isnumeric

示例: vartype('numeric')

最大离群值计数,仅适用于 'gesd' 方法,指定为由 'MaxNumOutliers' 和一个正整数组成的逗号分隔的对组。'MaxNumOutliers' 值指定 'gesd' 方法返回的离群值的最大数目。例如,isoutlier(A,'gesd','MaxNumOutliers',5) 最多返回五个离群值。

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

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

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

输出参数

全部折叠

离群值指示值,以向量、矩阵或多维数组形式返回。当 A 的对应元素为离群值时,TF 的元素为 true,否则为 falseTF 的大小与 A 相同。

数据类型: 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))

扩展功能

在 R2017a 中推出