Matlab - 如何从一组二维点中删除异常值?
Matlab - How to remove outliers from a set of 2D points?
我的问题分为两部分:
- 我有两个包含 X 和 Y 值的一维数组。如何创建另一个一维数组,其中每个元素都是一个二维点?
- 如何从结果数组中删除异常值?
例如,像这样:
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]]
我的目标是删除一组这样的点中的离群点(在顶部形成一条线的点):
首先创建一个 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 =
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
只是用于确定与离群值均值的差异阈值的容差因子的示例。
编辑:忘记成对输出结果成员。您可以为此使用 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, []);
我的问题分为两部分:
- 我有两个包含 X 和 Y 值的一维数组。如何创建另一个一维数组,其中每个元素都是一个二维点?
- 如何从结果数组中删除异常值?
例如,像这样:
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]]
我的目标是删除一组这样的点中的离群点(在顶部形成一条线的点):
首先创建一个 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 =
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
只是用于确定与离群值均值的差异阈值的容差因子的示例。
编辑:忘记成对输出结果成员。您可以为此使用 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, []);