Matlab-如何从一组2D点中去除异常值?

Matlab-如何从一组2D点中去除异常值?,matlab,outliers,Matlab,Outliers,我的问题分为两部分: 我有两个包含X和Y值的一维数组。如何创建另一个一维阵列,其中每个元素都是二维点? 如何从结果数组中删除异常值? 例如,类似这样的内容: x=[1234400]; y=[2 3 1 4 2 1 500]; xy=[1 2][3][2 1][4 4][2 2][3 1][400 500]; 结果=rmoutliersxy,‘平均值’; 结果应该如下所示: result = [[1 2] [3 3] [2 1] [4 4] [2 2] [3 1]] 我的目标是删除一组点中的异常

我的问题分为两部分:

我有两个包含X和Y值的一维数组。如何创建另一个一维阵列,其中每个元素都是二维点? 如何从结果数组中删除异常值? 例如,类似这样的内容:

x=[1234400]; y=[2 3 1 4 2 1 500]; xy=[1 2][3][2 1][4 4][2 2][3 1][400 500]; 结果=rmoutliersxy,‘平均值’; 结果应该如下所示:

result = [[1 2] [3 3] [2 1] [4 4] [2 2] [3 1]]
我的目标是删除一组点中的异常点,如顶部形成一条线的点:


首先创建一个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
现在将此矩阵传递给RMoutlier:

result = rmoutliers(xy);
结果的值现在应为:

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

请注意,无法在每个点都有2个维度的情况下创建一维数组,因为。。。那么根据定义,你有一个二维数组。保持简单,从一开始就建立一个二维矩阵

首先创建一个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
现在将此矩阵传递给RMoutlier:

result = rmoutliers(xy);
结果的值现在应为:

result =
     1     2
     3     3
     2     1
     4     4
     2     2
     3     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仅为公差系数的一个示例,用于确定与异常值平均值的差值阈值

编辑:忘记将结果的成员成对输出。您可以使用单元结构来实现这一点。运行程序后,在提示符处键入:

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, []);
函数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仅为公差系数的一个示例,用于确定与异常值平均值的差值阈值

编辑:忘记将结果的成员成对输出。您可以使用单元结构来实现这一点。运行程序后,在提示符处键入:

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, []);

忘了回答OP的第一个问题:编辑我的答案来解决这个问题很好!但是rMutters已经是一个内置的matlab函数,所以不需要op来实现所有这些。啊哈,我想我已经重新发明了轮子,真是太差劲了!尽管如此,他仍然可以使用单元格获得他想要的成对结果向量,从而解决OP的第一个问题:编辑我的答案来解决这个问题!但是rMutters已经是一个内置的matlab函数,所以不需要op来实现所有这些。啊哈,我想我已经重新发明了轮子,真是太差劲了!尽管如此,他仍然可以使用细胞来获得他想要的成对向量结果