2014-10-24 31 views
1

나는 무작위 데이터를 생성하기 위해 간단한 matlab 코드를 가지고 있고 유클리드 (Euclidean)와 마할 라 노비스 (Mahalanobis) 분류기를 사용하여 랜덤 데이터를 분류한다. 내가 겪고있는 문제는 각 분류 자의 오류 결과가 항상 동일하다는 것입니다. 둘 다 항상 같은 벡터를 잘못 분류합니다. 그러나 매번 데이터가 다릅니다.유클리드 (Euclidean) 및 마할 라 노비스 (Mahalanobis) 분류기는 항상 각 분류기에 대해 동일한 오류를 반환합니다.

따라서 데이터를 쉽게 확인하여 결과를 쉽게 확인할 수 있습니다. 우리는 모두 3 가지 클래스를 가질 수 있기 때문에, 각 클래스에 대해 333 개의 임의 값을 생성하고이를 모두 X에 추가하여 분류 할 수 있습니다. 따라서 결과는 각각 [class 1, class 2, class 3]이지만 333 개가되어야합니다.

나는 mvnrnd에 의해 생성 된 데이터가 매번 무작위이며 오류가 변경되는 것을 볼 수 있기 때문에 분류 작업을 알릴 수 있습니다. 그러나 두 분류 기준 사이에서 오류는 변하지 않습니다.

아무도 말할 수 있습니까?

% Create some initial values, means, covariance matrix, etc 
c = 3; 
P = 1/c; % All 3 classes are equiprobable 
N = 999; 
m1 = [1, 1]; 
m2 = [12, 8]; 
m3 = [16, 1]; 
m = [m1; m2; m3]; 
S = [4 0; 0 4]; % All share the same covar matrix 

% Generate random data for each class 
X1 = mvnrnd(m1, S, N*P); 
X2 = mvnrnd(m2, S, N*P); 
X3 = mvnrnd(m3, S, N*P); 
X = [X1; X2; X3]; 

% Create the solution array zEst to compare results to 
xEst = ceil((3/999:3/999:3)); 

% Do the actual classification for mahalanobis and euclidean 
zEuc = euc_mal_classifier(m', S, P, X', c, N, true); 
zMal = euc_mal_classifier(m', S, P, X', c, N, false); 

% Check the results 
numEucErr = 0; 
numMalErr = 0; 
for i=1:N 
    if(zEuc(i) ~= xEst(i)) 
     numEucErr = numEucErr + 1; 
    end 
    if(zMal(i) ~= xEst(i)) 
     numMalErr = numMalErr + 1; 
    end 
end 

% Tell the user the results of the classification 
strE = ['Euclidean classifier error percent: ', num2str((numEucErr/N) * 100)]; 
strM = ['Mahalanob classifier error percent: ', num2str((numMalErr/N) * 100)]; 
disp(strE); 
disp(strM); 

그리고 분류

function z = euc_mal_classifier(m, S, P, X, c, N, eOrM) 
    for i=1:N 
     for j=1:c 
      if(eOrM == true) 
       t(j) = sqrt((X(:,i)- m(:,j))'*(X(:,i)-m(:,j))); 
      else 
       t(j) = sqrt((X(:,i)- m(:,j))'*inv(S)*(X(:,i)-m(:,j))); 
      end 
     end 
     [num, z(i)] = min(t); 
    end 

답변

1

분류에 차이가 공분산 행렬에있다 없다가 이유.

클래스의 중심까지의 거리를 [x, y]라고 가정합니다. 유클리드 거리를 들어

는됩니다 마할 라 노비스 들어

sqrt(x*x + y*y); 

:

공분산 행렬의 역 :

inv([a,0;0,a]) = [1/a,0;0,1/a] 

거리 다음이다 : 따라서

sqrt(x*x*1/a + y*y*1/a) = 1/sqrt(a)* sqrt(x*x + y*y) 

, 클래스의 거리는 유클리드와 같지만 스케일 인수가 있습니다. 축척 계수는 모든 클래스와 차원에서 동일하기 때문에 클래스 할당에 차이가 없습니다.

다른 공분산 행렬로 테스트하면 오류가 다를 수 있습니다.