0

我有一个组织成结构的数据集。我有大量传感器,每个传感器都有四个读数ad因此结构D包含D.sensorIDD.aD.bD.cD.d。我正在寻找读数分布中的异常值。我已经绘制了数据并选择了限制并编写了一个脚本,该脚本可以识别具有超出这些限制的读数的传感器 ID,并将它们保存到一个数组中:

    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, 等等...然后我将结果拼凑在一起:

outliers = [A_hi; A_low; B_low; B_hi; C_low; C_hi; D_low; D_hi];

有没有更简洁的方法来做到这一点?

4

1 回答 1

3

1. 您遍历每个读数数组(向量)两次find:一次用于查找高异常值,一次用于查找低异常值。您可以通过以下方式在一次迭代中完成:

a_outlier_indices = find(D.a < aMin | D.a > aMax);

2. 另一件事:一般来说for在 MATLAB 中是相当昂贵的,尝试使用 MATLAB 语法的内置能力来产生相同的结果。更具体地说,MATLAB 允许您使用索引向量从另一个向量中提取子向量:

a_outliers = D.sensorID(a_outlier_indices);

简单地D.a输入一个索引向量会产生所需的异常值向量。

3. 另外,一个良好实践的建议:考虑将数组存储ad向量的单元数组而不是单独的数组中,例如:D.readings = {a, b, c, d},并定义相应的阈值单元数组(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)];

而不是outliers{i} = ...声明。

附言

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

于 2012-05-16T16:44:58.947 回答