2012-09-02 4 views
0

주어진 관측 세트의 평균 및 공분산 행렬을 계산하려고합니다. 점의 목록은 클래스 번호를 나타내는 첫 번째 차원, 관측 번호를 나타내는 두 번째 차원 및 좌표 번호를 나타내는 세 번째 차원이있는 3 차원 배열입니다. 비록 내가 평균을 계산할 수 있었지만, 공분산에 약간의 문제가있는 것으로 보인다. (당장 나는 제로 행렬을 얻는다.) 누군가가 내게 그것을 수정하는 방법을 말할 수 있다면 고마워 할 것입니다.다른 클래스의 공분산 계산

function [ meanEst, covEst, priorProbEst, classMem ] = estimateParams(trainingSet, classList) 
%estimateParams estimate all parameters for each class 

numRows = size(trainingSet, 1); 
numClasses = max(classList.'); 
%pointList = zeros(numClasses, numRows, 2); 
classMem = zeros(numClasses, 1); 

for rowCtr = 1:numRows 
    curClass = classList(rowCtr, 1); 
    classMem(curClass) = classMem(curClass) + 1; 
    pointList(curClass, classMem(curClass), 1) = trainingSet(rowCtr, 1); 
    pointList(curClass, classMem(curClass), 2) = trainingSet(rowCtr, 2); 
end 

meanEst  = zeros(numClasses, 2); 
covEst  = zeros(numClasses, 2, 2); 
priorProbEst = zeros(numClasses, 1); 
tot   = zeros(numClasses, 2); 

for classCtr = 1:numClasses 
    for pointCtr = 1:classMem(classCtr) 
     tot(classCtr, 1) = tot(classCtr, 1) + pointList(classCtr, pointCtr, 1); 
     tot(classCtr, 2) = tot(classCtr, 2) + pointList(classCtr, pointCtr, 2); 
    end 
    meanEst(classCtr, 1) = tot(classCtr, 1)/classMem(classCtr); 
    meanEst(classCtr, 2) = tot(classCtr, 2)/classMem(classCtr); 

    covEst(classCtr) = cov(pointList(classCtr)); 
    priorProbEst(classCtr) = classMem(classCtr)/numRows; 
end 
end 

시간을내어 보내 주셔서 감사합니다.

+0

각 반복에서 공분산 행렬을 계산할 행렬 (mxn)을 참조하고 싶지 않으십니까? –

+0

@diophantine 각 클래스의 공분산 행렬을 포인트 목록을 기반으로 계산하고 싶습니다. pointList는 3D 배열이므로 classCtr을 지정하면 간단한 관찰 행렬을 얻을 수 있습니다. 나는이 관찰을 인수로 cov 메소드를 호출하고있다. 어딘가 잘못 가고 있니? – Arani

답변

1

여러분은 3d pointList 행렬을 도입하여 복잡하다고 생각합니다. 그것이 괜찮다면 당신은 할 수 있지만 어딘가에 당신의 공분산 추정 오차가 있습니다.

관찰 당 클래스 ID가 있으므로 (예 : trainingSet의 각 행에 classList의 레이블이있는 경우) 구조에 데이터를 보관할 이유가 없습니다. 결과적으로 항상 trainingSet의 논리적 색인을 사용하여 meancov.의 데이터를 검색 할 수 있습니다. 일반적으로 추정/분류 작업의 N x M = observation x variables 데이터 행렬은 항상 도움이되는 MATLAB 함수와 일관된 규칙입니다.

예를 들어, 임의의 트레이닝 세트 (NxM 매트릭스)와 라벨 인덱스 (Nx1 목록에서 K = 4 클래스)를 만들고 각각에 대한 평균 및 공분산을 추정하여 각각 Kx22x2xK 행렬에 결과를 할당합니다.

nPoints = 200; % training set points 
nClass = 4; % number of unique classes 

% random training set of size nPoints x 2 (coordinates) 
classList = randi(nClass, nPoints, 1); 
trainingSet = randn(nPoints, 2); 

meanEst = zeros(nClass, 2); 
covEst = zeros(2, 2, nClass); 
for classID = 1:nClass 
    meanEst(classID,:) = mean(trainingSet(classList==classID,:)); 
    covEst(:,:,classID) = cov(trainingSet(classList==classID,:)); 
end 

증명으로 코드를 실행하면 위의 예와 같은 mean 결과를 생성합니다.

+0

Matlab에서 == 연산자를 효과적으로 사용하는 방법을 보여 주셔서 감사합니다. 나는 그것을 확인했으며 완벽하게 작동하고있다. – Arani