0

特定の観測値のセットの平均と共分散行列を計算しようとしています。点のリストは 3 次元配列で、最初の次元はクラス番号を表し、2 番目の次元は観測数を表し、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

これに時間を割いていただきありがとうございます!

4

1 に答える 1

1

pointList3次元マトリックスを導入することで物事を複雑にしていると思います。問題がなければ実行できますが、どこかに共分散推定エラーがあります。

観測ごとにクラス ID があるため、データをそのような構造に保持する理由はありません (つまり、各行にtrainingSetは の対応する行のラベルがありますclassList)。その結果、常に論理インデックスを使用しておよびtrainingSetの推定用のデータを取得できます。原則として、推定/分類タスクのデータ マトリックスは、常に役立つ規則であり、多くの MATLAB 関数と一致しています。 meancov.N x M = observation x variables

たとえば、以下では、ランダム トレーニング セット (NxM 行列) とラベル インデックス (Nx1 リストで K=4 クラス) を作成し、それぞれの平均と共分散を推定して、結果を aKx22x2xK行列にそれぞれ割り当てます。

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、上記の例と同じ結果が生成されます。

于 2012-09-02T23:22:38.977 に答える