-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathfscore.m
57 lines (48 loc) · 1.84 KB
/
fscore.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
function eval = fscore(idx, numclasses, numclassmembers)
% FSCORE Evaluate clustering result by comparing it with correct result.
% Assumes that correct result has observations of same class in sequence.
%
% eval = FSCORE(idx, numclasses, numclassmembers)
%
% Parameters:
% idx - Clustering result (e.g. such as given by kmeans)
% numclasses - Number of clusters/classes
% numclassmembers - Vector with size of each cluster (or a scalar if all
% clusters are of the same size)
% Output:
% eval - clustering fscore of idx for given classes
%
% N. Fachada
% Instituto Superior Técnico, Lisboa, Portugal
% If numclassmembers is a scalar, transform it in a vector
if max(size(numclassmembers)) == 1
numclassmembers = numclassmembers * ones(1, numclasses);
end;
% Set each class fscore to zero
fscores = zeros(1, numclasses);
% Determine the size of each cluster
numclustmembers = histc(idx, 1:numclasses);
% Determine F-Score for each class
for i=1:numclasses
% Determine starting index of idx for current class
if i > 1
indexFrom = sum(numclassmembers(1:(i-1))) + 1;
else
indexFrom = 1;
end;
% Determine endind index of idx for current class
indexTo = sum(numclassmembers(1:i));
% Must experiment for each cluster
classPointsInClusters = histc(idx(indexFrom:indexTo), 1:numclasses);
for j=1:numclasses
recall = classPointsInClusters(j) / numclassmembers(i);
precision = classPointsInClusters(j) / numclustmembers(j);
fscore_class = 2 * recall * precision / (recall + precision);
% If this is the highest fscore for this class, retain it
if (fscore_class > fscores(i))
fscores(i) = fscore_class;
end;
end;
end;
% Determine final fscore
eval = sum(fscores .* numclassmembers) / max(size(idx));