🔗 运行环境:Matlab
🚩 撰写作者:左手の明天
🥇 精选专栏:《python》
🔥 推荐专栏:《算法研究》
#### 防伪水印——左手の明天 ####
💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗
💗今天开启新的系列——重新定义matlab强大系列💗
📆 最近更新:2023 年 05 月 22 日,左手の明天的第 285 篇原创博客
📚 更新于专栏:matlab
#### 防伪水印——左手の明天 ####
函数说明
TF = isoutlier(A)
返回一个逻辑数组,当在 A
的元素中检测到离群值时,该数组中与之对应的元素为 true
。
-
如果
A
是矩阵,则isoutlier
分别对A
的每列进行运算。 -
如果
A
是多维数组,则isoutlier
沿A
的大小不等于 1 的第一个维度进行运算。 -
如果
A
是表或时间表,则isoutlier
分别对A
的每个变量进行运算。
默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差(MAD)的值。
中位数绝对偏差
对于由 N 个标量观测值组成的有限长度向量 A,中位数绝对偏差 (MAD) 定义为
MAD = median(∣∣Ai−median(A)∣∣)
,其中 i = 1,2,...,N。
换算 MAD 定义为
c*median(abs(A-median(A)))
,其中c=-1/(sqrt(2)*erfcinv(3/2))
。
TF = isoutlier(A,method)
指定检测离群值的方法。例如,isoutlier(A,"mean")
对偏离均值超过三倍标准差的所有元素返回 true
。
method
— 检测离群值的方法检测离群的方法,指定为以下值之一。
方法 描述 "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"
类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。
TF = isoutlier(A,"percentiles",threshold
)
将离群值定义为 threshold
所指定的百分位数以外的点。threshold
参数是包含上下百分位数阈值的二元素行向量,例如 [10 90]
。
TF = isoutlier(A,momvmethod,window
)
使用窗长度为 window
的移动窗方法检测局部离群值。例如,isoutlier(A,"movmedian",5)
对一个包含五个元素的窗口内偏离局部中位数超过三倍局部换算 MAD 的所有元素返回 true
。
movmethod
— 移窗法用来检测离群值的移窗法,指定为下列方法之一。
方法 描述 "movmedian"
离群值定义为在 window
指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 Hampel 滤波器。"movmean"
离群值定义为在 window
指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。
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")
检测矩阵中的离群值
查找矩阵每一行的离群值。
创建一个数据矩阵,其对角线上包含离群值。
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")