ПР6_Заболотников_9373
.pdfa2 = (Y_NORM(CLASTERS2(i, j)) - CENTERS_Y2(i)) ^ 2; sum_in_claster = sum_in_claster + (a1 + a2);
j = j + 1;
end;
CLS_SUMS2(s) = CLS_SUMS2(s) + sum_in_claster;
end;
end;
ordinates = zeros(1, k); for i = 1 : k
ordinates(i) = i;
end;
% отображение W(k) для k-means
%plot(ordinates, CLS_SUMS, '-o', 'MarkerEdgeColor', 'g', 'MarkerFaceColor', 'g');
%hold on;
plot(ordinates, F_SUMS, '-o', 'MarkerEdgeColor', 'g', 'MarkerFaceColor', 'g');
% отображение W(k) для k-medoids
%plot(ordinates, CLS_SUMS2, '-o', 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'k');
%%Пункт 6. Оценка качества кластеризации % см. пункты 4 и 5
%%Пункт 8. Модификация k-means++
%выбор первого начального центроида
CENTERS = zeros(2, k); CENTERS(1, 1) = X_NORM(1); CENTERS(2, 1) = Y_NORM(1); SUMS = zeros(1, n);
d = 0;
%выбор остальных начальных центроидов for r = 2 : k
summa = 0; for i = 1 : n
min_d = 10000; for j = 1 : k
if(CENTERS(1, j) ~= 0 && CENTERS(2, j) ~= 0)
d = (X_NORM(i) - CENTERS(1, j)) ^ 2 + (Y_NORM(i) - CENTERS(2, j)) ^ 2;
end;
if(d < min_d) min_d = d;
end;
end;
summa = summa + d; SUMS(i) = min_d;
end;
rnd = rand; while(rnd == 0)
rnd = rand;
end;
rnd = rnd * summa; summa = 0;
i = 1;
21
while(summa <= rnd) min_d = 10000; for j = 1 : k
if(CENTERS(1, j) ~= 0 && CENTERS(2, j) ~= 0)
d = (X_NORM(i) - CENTERS(1, j)) ^ 2 + (Y_NORM(i) - CENTERS(2, j)) ^ 2;
end;
if(d < min_d) min_d = d;
end;
end;
summa = summa + d; SUMS(i) = min_d; i = i + 1;
end;
CENTERS(1, r) = X_NORM(i); CENTERS(2, r) = Y_NORM(i);
end;
scatter(CENTERS(1, :), CENTERS(2, :), 'filled'); hold on;
CLASTERS3 = zeros(k, (n + 1)); ds = randi(1, 1, k);
% алгоритм k-means revision = 0; while(revision ~= k)
for j = 1 : k for r = 1 : n
CLASTERS3(j, r) = 0;
end;
end;
for i = 1 : n for j = 1 : k
sqr_x = (X_NORM(i) - CENTERS(1, j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS(2, j)) ^ 2; ds(j) = sqrt(sqr_x + sqr_y);
end;
min_d = 100; index = 0; for j = 1 : k
if (ds(j) < min_d) min_d = ds(j); index = j;
end;
end; j = 1;
while(CLASTERS3(index, j) ~= 0) j = j + 1;
end;
CLASTERS3(index, j) = i;
end;
revision = 0; for i = 1 : k r = 1;
22
summa_x = 0; summa_y = 0;
while((CLASTERS3(i, r) ~= 0) && (r <= n)) num = CLASTERS3(i, r);
summa_x = summa_x + X_NORM(num); summa_y = summa_y + Y_NORM(num); r = r + 1;
end;
new_center_x = summa_x / (r - 1); new_center_y = summa_y / (r - 1);
if(new_center_x == CENTERS(1, i) && new_center_y == CENTERS(2, i))
revision = revision + 1;
else
CENTERS(1, i) = new_center_x; CENTERS(2, i) = new_center_y;
end;
end;
end;
% отображение кластеров на графике
CLS = zeros((2 * k), (n + 1)); for i = 1 : (2 * k)
a = i / 2;
b = a - fix(a); if(b ~= 0)
j = 1;
while(CLASTERS3((fix(a) + 1), j) ~= 0)
CLS(i, j) = X_NORM(CLASTERS3((fix(a) + 1), j)); j = j + 1;
end;
else
j = 1;
while(CLASTERS3((fix(a)), j) ~= 0)
CLS(i, j) = Y_NORM(CLASTERS3(fix(a), j)); j = j + 1;
end;
end;
end; i = 1;
while(i < (2 * k)) j = 1;
while(CLS(i, j) ~= 0) if(i == 1)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0 0.4470 0.7410] , ...
'MarkerFaceColor', [0 0.4470 0.7410]);
end;
if(i == 3)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.8500 0.3250 0.0980] , ...
'MarkerFaceColor', [0.8500 0.3250 0.0980]);
end;
if(i == 5)
23
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.9290 0.6940 0.1250] , ...
'MarkerFaceColor', [0.9290 0.6940 0.1250]);
end;
if(i == 7)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.4940 0.1840 0.5560] , ...
'MarkerFaceColor', [0.4940 0.1840 0.5560]);
end;
if(i == 9)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.4660 0.6740 0.1880] , ...
'MarkerFaceColor', [0.4660 0.6740 0.1880]);
end;
if(i == 11)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.3010 0.7450 0.9330] , ...
'MarkerFaceColor', [0.3010 0.7450 0.9330]);
end;
if(i == 13)
plot(CLS(i, j), CLS((i + 1), j), 'o', 'MarkerEdgeColor', [0.6350 0.0780 0.1840] , ...
'MarkerFaceColor', [0.6350 0.0780 0.1840]);
end;
j = j + 1;
end;
i = i + 2;
end;
plot(CENTERS(1, :), CENTERS(2, :), 'p', 'MarkerEdgeColor', 'r', 'MarkerFaceColor', 'r');
%% Оценка работы k-means++ F3 = zeros(1, k);
C3 = zeros(1, k); summa = 0;
for i = 1 : k count = 0; j = 1;
sum_in_claster = 0; while(CLASTERS3(i, j) ~= 0)
a1 = (X_NORM(CLASTERS3(i, j)) - CENTERS(1, i)) ^ 2; a2 = (Y_NORM(CLASTERS3(i, j)) - CENTERS(2, i)) ^ 2; sum_in_claster = sum_in_claster + (a1 + a2);
count = count + 1; j = j + 1;
end;
F3(i) = sum_in_claster; C3(i) = count;
summa = summa + C3(i) * F3(i);
end;
summa = summa / n;
24