rmoutliers
语法
说明
在 B
= rmoutliers(A
)A
的数据中检测并删除离群值。
如果
A
是矩阵,则rmoutliers
会分别检测A
的每列中的离群值,并删除整行。如果
A
是表或时间表,则rmoutliers
会分别检测A
的每个变量中的离群值并删除整行。
默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。
使用一个或多个名称-值参数指定用来检测和删除离群值的其他参数。例如,B
= rmoutliers(___,Name,Value
)rmoutliers(A,"SamplePoints",t)
相对于时间向量 t
中的对应元素检测 A
中的离群值。
示例
删除向量中的离群值
创建一个包含两个离群值的向量,然后删除这些离群值。
A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57]; B = rmoutliers(A)
B = 1×13
57 59 60 59 58 57 58 61 62 60 62 58 57
使用均值检测方法
使用均值检测方法识别数据时间表中的潜在离群值,删除任何离群值,并可视化清洗后的数据。
创建一个数据时间表,并可视化数据以检测潜在的离群值。
T = hours(1:15); V = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57]; A = timetable(T',V'); plot(A.Time,A.Var1)
删除数据中的离群值,其中离群值定义为偏离均值超过三倍标准差的值。
B = rmoutliers(A,"mean")
B=14×1 timetable
Time Var1
_____ ____
1 hr 57
2 hr 59
3 hr 60
4 hr 100
5 hr 59
6 hr 58
7 hr 57
8 hr 58
10 hr 61
11 hr 62
12 hr 60
13 hr 62
14 hr 58
15 hr 57
在同一个图中,绘制原始数据和删除了离群值的数据。
hold on plot(B.Time,B.Var1,"o-") legend("Original Data","Cleaned Data")
使用移窗检测法
使用移动中位数在对应于某时间向量的正弦波中检测并删除局部离群值。
创建包含一个局部离群值的数据向量。
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 个小时),并删除这些离群值。
[B,TFrm] = rmoutliers(A,"movmedian",hours(5),"SamplePoints",t);
绘制原始数据和删除离群值后的数据。
plot(t,A) hold on plot(t(~TFrm),B,"o-") legend("Original Data","Cleaned Data")
删除包含离群值的列
从数据矩阵中删除离群值,并检查删除的列和离群值。
创建一个包含两个离群值的矩阵。
A = magic(5); A(4,4) = 200; A(5,5) = 300; A
A = 5×5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 200 3
11 18 25 2 300
通过将要删除的维度指定为 2 来删除包含离群值的列。返回逻辑输出向量 TFrm
以标识 A
中的哪些列被删除,并返回逻辑输出数组 TFoutlier
以标识 A
中离群值的位置。
[B,TFrm,TFoutlier] = rmoutliers(A,2)
B = 5×3
17 24 1
23 5 7
4 6 13
10 12 19
11 18 25
TFrm = 1x5 logical array
0 0 0 1 1
TFoutlier = 5x5 logical array
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 1
查找 A
中已删除列的值。
rmCol = A(:,TFrm)
rmCol = 5×2
8 15
14 16
20 22
200 3
2 300
查找 A
中被视为离群值的值。
rmVal = A(TFoutlier)
rmVal = 2×1
200
300
指定离群值位置
创建一个包含两个离群值的向量,并检测这些离群值的位置。
A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57]; detect = isoutlier(A)
detect = 1x15 logical array
0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
移除离群值。不使用检测方法,而是提供由 isoutlier
检测到的离群值位置。
B = rmoutliers(A,"OutlierLocations",detect)
B = 1×13
57 59 60 59 58 57 58 61 62 60 62 58 57
可视化离群值阈值
从数据向量中删除离群值,并可视化清洗后的数据。
创建一个包含离群值的数据向量。
A = [60 59 49 49 58 100 61 57 48 58];
使用默认检测方法 "median"
删除离群值。
[B,TFrm,TFoutlier,L,U,C] = rmoutliers(A);
绘制原始数据、删除了离群值的数据以及由检测方法确定的阈值和中心值。中心值是数据的中位数,上阈值和下阈值分别高于和低于中位数三倍换算 MAD。
plot(A) hold on plot(find(~TFrm),B,"o-") yline([L U C],":",["Lower Threshold","Upper Threshold","Center Value"]) legend("Original Data","Cleaned Data")
输入参数
A
— 输入数据
向量 | 矩阵 | 表 | 时间表
输入数据,指定为向量、矩阵、表或时间表。
如果
A
是一个表,则其变量的类型必须为double
或single
,您也可以使用DataVariables
参数显式列出double
或single
变量。当您使用的表中包含double
和single
数据类型之外的变量时,指定变量很有用。如果
A
是一个时间表,则rmoutliers
仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。
数据类型: 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 的元素。此方法也称为 Hampel 滤波器。 |
"movmean" | 离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。 |
window
— 窗长度
正整数标量 | 由正整数组成的二元素向量 | 正持续时间标量 | 由正持续时间组成的二元素向量
窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。
如果 window
是正整数标量,则窗口以当前元素为中心并且包含 window-1
个相邻元素。如果 window
是偶数,则窗口以当前元素和上一个元素为中心。
如果 window
是由正整数组成的二元素向量 [b f]
,则窗口包含当前元素、其之前的 b
个元素和之后的 f
个元素。
当 A
是时间表或者 SamplePoints
被指定为 datetime
或 duration
向量时,window
的类型必须是 duration
,而且将会基于样本点来计算窗口。
dim
— 要删除的维度
1 (默认) | 2
要删除的维度,指定为 1 或 2。默认情况下,rmoutliers
会删除每个包含(检测到的)离群值的行。要删除每个包含(检测到的)离群值的矩阵列或表变量,请将维度指定为 2。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
示例: rmoutliers(A,ThresholdFactor=4)
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: rmoutliers(A,"ThresholdFactor",4)
SamplePoints
— 样本点
向量 | 表变量名称 | 标量 | 函数句柄 | 表 vartype
下标
采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...]
是默认值。
当输入数据是表时,可以使用以下选项之一将采样点指定为表变量。
表输入的选项 | 描述 | 示例 |
---|---|---|
变量名称 | 指定单个表变量名称的字符向量或标量字符串 |
|
标量变量索引 | 标量表变量索引 |
|
逻辑向量 | 逻辑向量,每个元素分别对应一个表变量,其中 |
|
函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量,对于仅一个表变量,该标量必须为 |
|
vartype 下标 | 由 |
|
注意
当输入数据为 timetable
时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。
移动窗基于样本点进行定义。例如,如果 t
是与输入数据对应的时间向量,则 rmoutliers(rand(1,10),"movmean",3,"SamplePoints",t)
将有一个代表 t(i)-1.5
和 t(i)+1.5
之间时间间隔的窗。
当样本点向量的数据类型为 datetime
或 duration
时,移动窗长度的类型必须为 duration
。
示例: rmoutliers(A,"SamplePoints",0:0.1:10)
示例: rmoutliers(T,"SamplePoints","Var1")
数据类型: single
| double
| datetime
| duration
DataVariables
— 要对其进行操作的表变量
表变量名称 | 标量 | 向量 | 元胞数组 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。DataVariables
值指示要检查输入表中的哪些变量具有离群值。与指示的变量关联的数据类型必须为 double
或 single
。
表中未由 DataVariables
指定的其他变量将传递给输出,而不检查离群值。
对 A
的行执行运算时,rmoutliers
将删除在与指定的变量对应的列中包含离群值的所有行。对 A
的列执行运算时,rmoutliers
将从表中删除指定的变量。
选项 | 描述 | 示例 |
---|---|---|
变量名称 | 指定单个表变量名称的字符向量或字符串标量 |
|
变量名称的向量 | 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称 |
|
变量索引的标量或向量 | 表变量索引的标量或向量 |
|
逻辑向量 | 逻辑向量,每个元素分别对应一个表变量,其中 |
|
函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量 |
|
vartype 下标 | 由 |
|
示例: rmoutliers(T,"DataVariables",["Var1" "Var2" "Var4"])
ThresholdFactor
— 检测阈值因子
非负标量
检测阈值因子,指定为非负标量。
对于方法 "median"
和 "movmedian"
,检测阈值因子将代替换算 MAD 的倍数(默认为 3)。
对于方法 "mean"
和 "movmean"
,检测阈值因子将取代与均值相差的标准差个数(默认为 3)。
对于方法 "grubbs"
和 "gesd"
,检测阈值因子是 0 到 1 范围内的一个标量。值接近 0 会得到较少数目的离群值,值接近 1 则会得到较多数目的离群值。默认的检测阈值因子为 0.05。
对于 "quartiles"
方法,检测阈值因子将代替四分差的默认倍数(默认为 1.5)。
当指定的方法是 "percentiles"
时,不支持此名称-值对组。
OutlierLocations
— 已知离群值指示值
向量 | 矩阵
已知的离群值指示符,指定为与 A
大小相同的逻辑向量或矩阵。已知的离群值指示符元素可以是数值或逻辑值 1 (true
) 以指示在 A
的对应位置中的离群值,或是 0 (false
) 以指示非离群值。当您指定 OutlierLocations
时,rmoutliers
将不再使用离群值检测方法。而是会用已知离群值指示符中的元素来定义离群值。输出 TFoutlier
包含相同的逻辑向量或矩阵。
如果指定了 method
,则不能再指定 OutlierLocations
名称-值参数。
数据类型: logical
MaxNumOutliers
— GESD 检测到的最大离群值
正整数标量
GESD 检测到的最大离群值,指定为正整数标量。MaxNumOutliers
值指定 "gesd"
方法检测到的离群值的最大数目。例如,rmoutliers(A,"gesd","MaxNumOutliers",5)
最多检测到五个离群值。
MaxNumOutliers
的默认值是最接近 A
中的元素数的 10% 的整数。为离群值数上限设置较大的值,可以更可能检测到所有离群值,但代价是降低计算效率。
"gesd"
方法假定非离群值输入数据是从近似正态分布采样的。如果数据不是以这种方式采样的,则检测的离群值数量可能会超过 MaxNumOutliers
值。
MinNumOutliers
— 满足删除条件的最小离群值数目
1 (默认) | 正整数标量
满足删除条件的最小离群值数目,指定为正整数标量。MinNumOutliers
值指定删除行或列所需的最小离群值数。例如,当检测到某一行中有 3 个或更多离群值时,rmoutliers(A,"MinNumOutliers",3)
会删除矩阵 A
的这一行。
输出参数
B
— 已删除离群值的数据
向量 | 矩阵 | 表 | 时间表
已删除离群值的数据,以向量、矩阵、表或时间表的形式返回。B
的大小取决于删除的行数或列数。
TFrm
— 已删除数据的指示符
向量
已删除数据的指示符,以逻辑向量形式返回。值为 1 (true
) 的元素对应于 A
中删除的行或列。值为 0 (false
) 的元素对应于未更改的行或列。TFrm
的方向和大小取决于 A
和操作的维度。
数据类型: logical
TFoutlier
— 离群值指示值
向量 | 矩阵
离群值指示符,以逻辑向量或矩阵形式返回。值为 1 (true
) 的元素对应于 A
中离群值的位置。值为 0 (false
) 的元素对应于非离群值。
TFoutlier
的大小与 A
相同。
数据类型: logical
L
— 下阈值
标量 | 向量 | 矩阵 | 表 | 时间表
离群值检测方法使用的下阈值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的下阈值是比输入数据的中位数小三倍换算 MAD 的值。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,L
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 L
的大小与 A
相同。
U
— 上阈值
标量 | 向量 | 矩阵 | 表 | 时间表
离群值检测方法使用的上阈值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的上阈值是比输入数据的中位数大三倍换算 MAD 的值。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,U
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 U
的大小与 A
相同。
C
— 中心值
标量 | 向量 | 矩阵 | 表 | 时间表
离群值检测方法使用的中心值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。
如果使用 method
进行离群值检测,则除了在运算维度上的长度为 1 外,C
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 C
的大小与 A
相同。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持
"percentiles"
、"grubbs"
和"gesd"
方法。"movmedian"
和"movmean"
方法不支持 tall 时间表。不支持
SamplePoints
和MaxNumOutliers
名称-值参数。DataVariables
的值不能是函数句柄。仅当
A
为 tall 列向量时,才支持沿第一个维度计算rmoutliers(A)
、rmoutliers(A,"median",...)
或rmoutliers(A,"quartiles",...)
。tall 表不支持
rmoutliers(A,2)
。
有关详细信息,请参阅 tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
用于检测离群值的
"movmean"
和"movmedian"
方法不支持时间表输入数据、日期时间SamplePoints
值或持续时间SamplePoints
值。对于表输入数据,
dim
必须等于1
。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不支持
"movmedian"
移动方法。不支持
SamplePoints
和DataVariables
名称-值参数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2018b 中推出R2022b: 返回离群值指示符、下阈值、上阈值和中心值
您可以选择返回与输入数据中离群值位置对应的逻辑离群值指示符。您还可以返回离群值检测方法使用的下阈值、上阈值和中心值。
R2022b: 定义离群值位置
使用已知的离群值指示符定义输入数据中离群值的位置。您可以通过将 OutlierLocations
名称-值参数设置为与输入数据大小相同的逻辑数组来定义离群值位置,而不是使用离群值检测方法。
如果指定了 method
,则不能再指定 OutlierLocations
名称-值参数。
R2021b: 将采样点指定为表变量
对于表输入数据,可以使用 SamplePoints
名称-值参数将采样点指定为表变量。
另请参阅
函数
实时编辑器任务
App
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)