Я использую RANSAC в качестве надежного метода регрессии. Я нашел удобный набор инструментов здесь, который выполняет RANSAC от Марко Зулиани. Я видел, что есть примеры для линии и плоскости, но что, если есть много независимых переменных, как в многомерной регрессии. Есть ли способ изменить код, чтобы справиться с этим?
До сих пор я пытался изменить 3D-код для обработки N измерений. Когда я это делаю, я получаю все баллы как вставки, и я знаю, что это, вероятно, неправильно. Это переобучение данных. Ниже приведены модификации, которые я устал делать.
Для test_RANSAC_plane.m
я просто добавил больше строк в X
Для estimate_plane.m
:
function [Theta, k] = estimate_plane(X, s)
% cardinality of the MSS
k = size(X,1);
if (nargin == 0) || isempty(X)
Theta = [];
return;
end;
if (nargin == 2) && ~isempty(s)
X = X(:, s);
end;
% check if we have enough points
N = size(X, 2);
if (N < k)
error('estimate_plane:inputError', ...
'At least k points are required');
end;
A = [];
for i=1:k
A = [A transpose(X(i, :))];
end
A = [A ones(N, 1)];
[U S V] = svd(A);
Theta = V(:, k+1);
return;
Для error_plane.m
:
function [E T_noise_squared d] = error_plane(Theta, X, sigma, P_inlier)
% compute the squared error
E = [];
k = size(X,1);
den = 0;
if ~isempty(Theta) && ~isempty(X)
for i=1:k
den = den + Theta(i)^2;
end
sum = Theta(1)*X(1,:);
for j=2:k
sum = sum + Theta(j)*X(j,:);
end
sum = sum + Theta(j+1);
E = (sum).^2 / den;
end;
% compute the error threshold
if (nargout > 1)
if (P_inlier == 0)
T_noise_squared = sigma;
else
d = k;
% compute the inverse probability
T_noise_squared = sigma^2 * chi2inv_LUT(P_inlier, d);
end;
end;
return;