Matlab-如何从一组2D点中删除离群值?

时间:2020-10-01 19:44:27

标签: matlab outliers

我的问题分为两个部分:

  1. 我有两个包含X和Y值的一维数组。如何创建每个元素都是2D点的另一个1D数组?
  2. 如何从结果数组中删除异常值?

例如,如下所示:

x = [1 3 2 4 2 3 400];
y = [2 3 1 4 2 1 500];
xy = [[1 2] [3 3] [2 1] [4 4] [2 2] [3 1] [400 500]];
result = rmoutliers(xy, 'mean');

结果应如下所示:

result = [[1 2] [3 3] [2 1] [4 4] [2 2] [3 1]]

我的目标是在这样的一组点中去除异常点(这些点在顶部形成一条线):

enter image description here

2 个答案:

答案 0 :(得分:4)

首先创建一个nx2矩阵。

x = [1 3 2 4 2 3 400]';
y = [2 3 1 4 2 1 500]';
xy = [x, y]

现在xy采用以下形式:

xy = 
     1     2
     3     3
     2     1
     4     4
     2     2
     3     1
   400   500

现在将此矩阵通过rmoutliers

result = rmoutliers(xy);

result的值现在应该是:

result =
     1     2
     3     3
     2     1
     4     4
     2     2
     3     1

请注意,由于每个点都有2维,所以无法制作一维数组,因为……那么根据定义,您就有了2维数组。保持简单,从一开始就构建二维矩阵!

答案 1 :(得分:2)

函数rmoutliers.m应该类似于以下内容:

function [result] = rmoutliers(x, y, tol)
% rmoutliers: main function,
% removes outliers with absolute value > tol(a scalar)
% out of [x,y] series
dist = calcDist(x, y);
mean = calcMean(dist);
result = zeros(2,length(x));

for i = 1:length(dist)
    result(:,i) = [x(i), y(i)];
    if abs(dist(i) - mean) > tol
        result(:,i) = [-1, -1];
    end  
end

result(result == -1) = [];
result = reshape(result, 2, []);

end



function [dist] = calcDist(x, y)
%calcDist: calculates absolute value of
% each pair of elements in [x, y]
% (the distance from the origin)
dist = sqrt(x.^2 + y.^2);

end



function [mean] = calcMean(dist)
%calcMean: average of input array
mean = sum(dist) / length(dist);

end

所有内容都放在您的 Documents / MATLAB 目录中的自己的文件rmoutliers.m中。 应该在Matlab主提示符下通过键入以下内容来唤醒它:

x = [1 3 2 4 2 3 400];
y = [2 3 1 4 2 1 500];
result = rmoutliers(x, y, 100);

其中100只是公差因子的一个示例,该公差因子将用于确定与异常值的平均值之差的阈值。

编辑:忘记将结果成员成对输出。您可以为此使用cell结构。运行该程序后,在提示符下键入:

C = cell(1,length(x));
for i = 1:length(x)
    C(i) = {result(1,i), result(2,i)};
end

% to read from cell structure:
D = cell2mat(C);
D = reshape(D,2, []);