我将数据集组织成一个结构。我有大量传感器,每个传感器有a
到d
四个读数,因此结构D
包含D.sensorID
,D.a
,{{1} },D.b
和D.c
。我正在寻找读数分布中的异常值。我已经绘制了数据并选择了限制,并编写了一个脚本,用于识别带有超出这些限制的读数的sensorID,并将它们保存到数组中:
D.d
重复此操作: aMax = 5;
aHighIndices = find(D.a>aMax);
aMin = 0;
aLowIndices = find(D.a<aMin);
aHighLength = size(aHighIndices);
for i = 1:aHighLength
A_hi(i) = D.sensorID(aHighIndices(i));
end
,a_Hi
,a_Low
等等......然后我将结果修补到一起:
b_Hi
有更简洁的方法吗?
答案 0 :(得分:3)
<强> 1 强>
使用find
两次遍历读数的每个数组(即向量):
一次用于寻找高异常值,一次用于寻找低异常值。您可以通过以下方式在一次迭代中完成:
a_outlier_indices = find(D.a < aMin | D.a > aMax);
<强> 2 强>
另一件事:一般来说,MATLAB中的for
相当昂贵,尝试使用MATLAB语法的内置功能来产生相同的结果。更具体地说,MATLAB允许您使用索引向量从另一个向量中提取子向量:
a_outliers = D.sensorID(a_outlier_indices);
简单地向D.a
提供一个索引向量,得到所需的异常值向量。
第3 强>
此外,建议良好实践:考虑将数组a
通过d
存储在向量的单元格数组中,而不是单独的数组,例如:D.readings = {a, b, c, d}
,并定义相应的阈值单元格数组({在我的示例中为{1}},因此您可以使用循环来保存一些代码:
thr
现在,您将拥有单元格数组thr = {[aMin, aMax]; [bMin, bMax]; [cMin, cMax]; [dMin, dMax]}
outliers = cell(4, 1);
for i = 1:4
outlier_indices = find(D.readings{i} < thr{i}(1) | D.readings{i} > thr{i}(2));
outliers{i} = D.sensorID(outlier_indices);
end
中的所有内容。要使用outliers
访问 a 异常值,要使用outliers{1}
访问 b 异常值,依此类推......
您当然可以通过outliers{2}
循环内的简单连接将所有内容(如问题中)修补到一个向量中:
for
而不是outliers = [outliers, D.sensorID(outlier_indices)];
语句。
P.S
我假设使用最小/最大阈值是您在查找异常值时要使用的内容。 还有其他方法可以找到异常值,但这些方法会产生不同的结果。