我正在尝试对2D数组值进行离群值分析,我的数据如下所示:
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
根据我的任务要求,我需要消除所有那些与平均值相差1个标准偏差的值,我被困的地方是:
此套装的平均值= 9.9900 10.0057 10.0180 10.0051 9.9312和
标准偏差= 3.0257 3.0208 3.0119 2.9924 2.9868
我无法计算如何根据平均值和标准偏差计算异常值。在这方面的任何帮助都非常感谢。
P.S:我对Matlab和数据分析都很陌生。所以,请原谅任何不相关的信息。答案 0 :(得分:1)
通常,使用isoutlier function在Matlab上执行此操作。当method
参数作为mean
传递给函数调用时,用于检测异常值的均值方差方法(您在问题中引用的方法)应用于观察值:
方法 - 确定异常值的方法'中位数' (默认)| '平均' | '四分位数' | '格鲁布斯' | ' 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),:) = [];
考虑到从平均值增加容差越多,异常值就越少。使用基于3
标准偏离平均值的内置isoutlier function,可以检测到非常少的异常值:
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
答案 1 :(得分:0)
整个数据的平均值为:data_mu=mean(mean(data))
其中数据是所有值的矩阵。
标准差为:data_std=std(std(data))
。
唯一的问题是你应该检查数据是在低位还是高位之间。
您应该开发如下代码:
data_mu=mean(mean(data));
data_std=std(std(data));
counter=0;
upper_bond=data_mu+data_std;
lower_bond=data_mu-data_std;
for i=1:size(data,1)
for j=1:size(data,2)
if data(i,j)>lower_bond && data(i,j)<upper_bond
counter=counter+1;
standard_data(counter)=data(i,j);
end
end
end