Многомерная регрессия RANSAC

Я использую 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;

person Baker Johnson    schedule 29.10.2014    source источник
comment
см. csd.uwo.ca/~yuri/Abstracts/ijcv10_pearl-abs .shtml   -  person Shai    schedule 29.10.2014
comment
В одном примере показана трехмерная ситуация. Что произойдет, если вы просто попытаетесь увеличить количество измерений? Кроме того, пожалуйста, поделитесь тем, что вы пробовали в целом.   -  person Dennis Jaheruddin    schedule 06.11.2014
comment
Я обновил вопрос, чтобы включить код до сих пор.   -  person Baker Johnson    schedule 07.11.2014
comment
из вашего вопроса непонятно: какова размерность каждой точки? сколько точек у вас есть, чтобы соответствовать? какова ваша модель: это линейное подпространство меньшего измерения, чем входное измерение, или это смесь плоскостей в более высоком измерении?   -  person Shai    schedule 10.11.2014
comment
Что я пытаюсь сделать, так это сделать код более общим, чтобы кто-то мог ввести любые размеры данных и получить результат. Таким образом, размеры каждой точки и количество точек, которые нужно разместить, заранее неизвестны. Для модели я следовал исходному коду в том смысле, что модель представляла собой массив с количеством строк, равным количеству измерений плюс один (константа). Это будет уравнение линии, моделирующей вставки.   -  person Baker Johnson    schedule 10.11.2014


Ответы (1)


Я не знаю об этом наборе инструментов, но я использовал эту функцию в прошлом:

http://www.peterkovesi.com/matlabfns/Robust/ransac.m

Он не такой сложный, но работает хорошо и без проблем справляется с произвольной размерностью.

person gregswiss    schedule 09.09.2015