识别数据异常值

时间:2012-05-16 15:28:05

标签: matlab

我将数据集组织成一个结构。我有大量传感器,每个传感器有ad四个读数,因此结构D包含D.sensorIDD.a,{{1} },D.bD.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_Hia_Low等等......然后我将结果修补到一起:

b_Hi

有更简洁的方法吗?

1 个答案:

答案 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

我假设使用最小/最大阈值是您在查找异常值时要使用的内容。 还有其他方法可以找到异常值,但这些方法会产生不同的结果。