-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvalid_sumsqures.m
59 lines (53 loc) · 1.64 KB
/
valid_sumsqures.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
function [T, W, B, Sintra, Sinter] = valid_sumsqures(data,labels,k)
% =========================================================================
% data: a matrix with each column representing a variable.
% labels: a vector indicating class labels
% W within-group sum of squares and cross-products
% B between-group sum of squares and cross-products
% T total sum of squares and cross-products
% Sintra & Sinter: centroid diameter & linkage distance
% =========================================================================
% Copyright (C) 2006-2007, Kaijun Wang, [email protected]
% =========================================================================
if (size(labels, 1) == 1)
labels = labels';
end
[ncase,m] = size(data);
% computing the Total sum of squares matrix
Dm = mean(data);
Dm = data - Dm(ones(ncase,1),:);
T = Dm'*Dm;
% computing within sum of squares matrix
W = zeros(size(T));
Dm = zeros(k,m);
Sintra = zeros(1,k);
for i = 1:k
if k > 1
Cindex = find(labels == i);
else
Cindex = 1:ncase;
end
nk = length(Cindex);
if nk > 1
dataC = data(Cindex,:);
m = mean(dataC);
Dm(i,:) = m;
dataC = dataC - repmat(m,nk,1); %m(ones(nk,1),:)
W = W + dataC'*dataC;
dataC = sum(dataC.^2,2);
Sintra(i) = mean(sqrt(dataC)); % distances to cluster center
end
clear dataC
end
B = T - W;
% distances between cluster centers
Sinter = zeros(k,k);
if k > 1
for i = 1:k
for j = i+1:k
m = abs(Dm(i,:) - Dm(j,:));
Sinter(i,j) = sqrt(sum(m.^2));
Sinter(j,i) = Sinter(i,j);
end
end
end