2014-10-29 18 views
7

Sto usando RANSAC come metodo di regressione robusto. Ho trovato una cassetta degli attrezzi pulita here che esegue RANSAC di Marco Zuliani. Ho visto che ci sono esempi per una linea e un piano, ma che succede se ci sono molte variabili indipendenti come nella regressione multivariata. Esiste comunque la possibilità di modificare il codice per gestirlo?Regressione multivariata RANSAC

Quello che ho provato fino ad ora è la modifica del codice 3D per gestire N dimensioni. Quando faccio questo ottengo tutti i punti come inliers e so che probabilmente non è corretto. Questo è eccessivo adattamento dei dati. Di seguito sono le modifiche che sono stanco di fare.

Per test_RANSAC_plane.m Ho appena aggiunto più righe per X

Per 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; 

Per 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; 
+0

vedere http://www.csd.uwo.ca/~yuri/Abstracts/ijcv10_pearl-abs.shtml – Shai

+0

One l'esempio mostra una situazione tridimensionale, cosa succede se cerchi semplicemente di aumentare il numero di dimensioni? Inoltre, per favore condividi ciò che hai provato in generale finora. –

+0

Ho aggiornato la domanda per includere il codice finora. –

risposta