This repository has been archived by the owner on Feb 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathevaluateLoopBayesian.m
61 lines (49 loc) · 2.61 KB
/
evaluateLoopBayesian.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
function [ guessedCategories, results ] = evaluateLoopBayesian(thetaSeenSoftmax, thetaUnseenSoftmax, ...
thetaMapping, seenSmTrainParams, unseenSmTrainParams, mapTrainParams, trainX, trainY, images, ...
categories, lambdas, knn, nplofAll, pdistAll, numPerCategory, zeroCategoryTypes, nonZeroCategoryTypes, categoryNames, doPrint)
addpath toolbox;
numImages = size(images, 2);
numCategories = length(zeroCategoryTypes) + length(nonZeroCategoryTypes);
Ws = stack2param(thetaSeenSoftmax, seenSmTrainParams.decodeInfo);
Wu = stack2param(thetaUnseenSoftmax, unseenSmTrainParams.decodeInfo);
mappedImages = mapDoMap(images, thetaMapping, mapTrainParams);
priors = calcOutlierPriors( mappedImages, trainX, trainY, numPerCategory, nonZeroCategoryTypes, lambdas, knn, nplofAll, pdistAll );
% This is the seen label classifier
probSeen = exp(Ws{1}*images); % k by n matrix with all calcs needed
probSeen = bsxfun(@rdivide,probSeen,sum(probSeen));
probSeenFull = zeros(numCategories, numImages);
probSeenFull(nonZeroCategoryTypes, :) = probSeen;
% This is the unseen label classifier
probUnseen = exp(Wu{1}*mappedImages); % k by n matrix with all calcs needed
probUnseen = bsxfun(@rdivide,probUnseen,sum(probUnseen));
probUnseenFull = zeros(numCategories, numImages);
probUnseenFull(zeroCategoryTypes, :) = probUnseen;
finalProbs = bsxfun(@times, probSeenFull, 1 - priors) + bsxfun(@times, probUnseenFull, priors);
[~, guessedCategories ] = max(finalProbs);
% Calculate scores
confusion = zeros(numCategories, numCategories);
for actual = 1:numCategories
guessesForCategory = guessedCategories(categories == actual);
for guessed = 1:numCategories
confusion(actual, guessed) = sum(guessesForCategory == guessed);
end
end
truePos = diag(confusion); % true positives, column vector
results.accuracy = sum(truePos) / numImages;
numUnseen = sum(arrayfun(@(x) nnz(categories == x), zeroCategoryTypes));
results.unseenAccuracy = sum(truePos(zeroCategoryTypes)) / numUnseen;
results.seenAccuracy = (sum(truePos) - sum(truePos(zeroCategoryTypes))) / (numImages - numUnseen);
t = truePos ./ sum(confusion, 2);
results.avgPrecision = mean(t(isfinite(t), :));
t = truePos' ./ sum(confusion, 1);
results.avgRecall = mean(t(:, isfinite(t)));
results.confusion = confusion;
if doPrint == true
disp(['Accuracy: ' num2str(results.accuracy)]);
disp(['Seen Accuracy: ' num2str(results.seenAccuracy)]);
disp(['Unseen Accuracy: ' num2str(results.unseenAccuracy)]);
disp(['Averaged precision: ' num2str(results.avgPrecision)]);
disp(['Averaged recall: ' num2str(results.avgRecall)]);
displayConfusionMatrix(confusion, categoryNames);
end
end