通常,Matlab 上的此操作使用isoutlier function 执行。当method 参数作为mean 传递给函数调用时,用于检测异常值(您在问题中提到的方法)的均值方差方法应用于观察:
method — 确定异常值“中值”的方法(默认)| '意思' |
'四分位数' | '蛴螬' | 'gesd'
'mean' 对于超过三个标准差的元素返回 true
从平均数。这种方法比“中值”更快,但不够稳健。
不幸的是,它基于3 与平均值的标准差,而不是仅1 与平均值的标准差。因此,必须实现自定义代码。给定观察矩阵A,这应该可以正常工作:
m = nanmean(A,1);
s = nanstd(A,1);
lb = m - s;
ub = m + s;
is_outlier = ((A < lb) | (A > ub));
is_outlier 变量将是与A 大小相同的逻辑值矩阵,其中true 值表示异常值:
A = [
10.836126 6.342457 6.359280 4.865735 11.332891;
13.228078 17.779455 11.021488 10.057800 13.371285;
11.350769 15.052270 10.556633 7.909101 7.627935;
11.841888 4.655980 8.363947 10.808192 12.761605;
2.534398 6.189042 6.987835 8.412396 8.166305
];
m = nanmean(A,1);
s = nanstd(A,1);
lb = m - s;
ub = m + s;
is_outlier = ((A < lb) | (A > ub))
is_outlier =
0 0 1 1 0
0 1 1 0 1
0 0 1 0 1
0 1 0 1 0
1 0 0 0 1
我唯一的疑问是您提供的方法和差异。它们与您根据给定数据计算的不同:
A = [
10.836126 6.342457 6.359280 4.865735 11.332891;
13.228078 17.779455 11.021488 10.057800 13.371285;
11.350769 15.052270 10.556633 7.909101 7.627935;
11.841888 4.655980 8.363947 10.808192 12.761605;
2.534398 6.189042 6.987835 8.412396 8.166305
];
m = nanmean(A,1)
s = nanstd(A,1)
m =
9.9582518 10.0038408 8.6578366 8.4106448 10.6520042
s =
3.79639885205053 5.33862997268428 1.86284269833871 2.062972979429 2.35083838144151
因此,如果您必须使用它们,您可以简单地进行如下操作:
A = [
10.836126 6.342457 6.359280 4.865735 11.332891;
13.228078 17.779455 11.021488 10.057800 13.371285;
11.350769 15.052270 10.556633 7.909101 7.627935;
11.841888 4.655980 8.363947 10.808192 12.761605;
2.534398 6.189042 6.987835 8.412396 8.166305
];
m = [9.9900 10.0057 10.0180 10.0051 9.9312];
s = [3.0257 3.0208 3.0119 2.9924 2.9868];
lb = m - s;
ub = m + s;
is_outlier = ((A < lb) | (A > ub))
is_outlier =
0 1 1 1 0
1 1 0 0 1
0 1 0 0 0
0 1 0 0 0
1 1 1 0 0
一旦您知道必须将 A 的哪些元素视为异常值,您就可以继续按照自己的喜好处理它们。例如,您可以将它们设置为NaN,如下所示:
A(is_outlier) = NaN;
或者您可以删除所有包含一个或多个异常值的列,如下所示:
A(any(is_outlier),:) = [];
请考虑,您对均值的容差增加得越多,离群值就越少。使用内置的isoutlier function,它基于远离均值的3 标准差,检测到的异常值非常少:
A = [
10.836126 6.342457 6.359280 4.865735 11.332891;
13.228078 17.779455 11.021488 10.057800 13.371285;
11.350769 15.052270 10.556633 7.909101 7.627935;
11.841888 4.655980 8.363947 10.808192 12.761605;
2.534398 6.189042 6.987835 8.412396 8.166305
];
isoutlier(A) % lb = m - (3 * s) AND ub = m + (3 * s)
ans =
0 0 0 0 0
0 1 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0