2012-09-02 49 views
0

的協方差我試圖計算一組給定的意見的均值和方差矩陣。點的列表是一個3 d陣列與表示的類別號,代表觀測數和表示座標數第三維度的第二維度的第一維度。雖然我已經能夠計算出平均值,似乎有一些問題,協方差(現在,我得到一個零矩陣)。如果有人能告訴我如何糾正,我將不勝感激。計算不同類別

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)來計算每次迭代的協方差矩陣嗎? – 2012-09-02 20:43:15

+0

@diophantine我想根據點的列表計算每個類的協方差矩陣。由於pointList是一個3d數組,通過指定classCtr,我可以得到一個簡單的觀察矩陣。我將這些觀察結果作爲論點來調用cov方法。我在哪裏錯了? – Arani

回答

1

我認爲你是通過引入3D pointList基質複雜的事情。如果感覺不錯,你可以做,但是有一個地方存在你的協方差估計錯誤。

沒有理由將數據保存在這樣的結構中,因爲每個觀察結果都有類別標識(即trainingSet中的每一行都具有classList中相應行的標籤)。因此,您始終可以使用trainingSet中的邏輯索引檢索用於估計meancov.的數據。通常,任何估算/分類任務的數據矩陣都是一種慣例,它總是有幫助的,並且與許多MATLAB函數一致。例如,下面我創建一個隨機訓練集(N×M矩陣)和標籤索引(N = 1列表中的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