Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПР6_Заболотников_9373

.pdf
Скачиваний:
1
Добавлен:
20.06.2023
Размер:
653.29 Кб
Скачать

ПРИЛОЖЕНИЕ А

ПРОГРАММЫЙ КОД (ЯЗЫК ПРОГРАММИРОВАНИЯ – MATLAB)

%%Исходные данные clear; clc;

X_ORIG = [97 102 83 90 102 109 108 98 107 53 54 77 ...

94 84 212 71 105 98 79 90 62 108 153 69 60 58 ...

91 64 97 75 95 154 242 295 87 94 203 22 96 103 ...

138 140 138 89 20 81 30 72 112 158 125 36 77 154 ...

107 99 44 47 120 108 115 75 97 44 78 110 101 98 ...

105 84 73 108 106 106 107 105 110 98 72 83 87 79 ...

107 109 113 110 100 92 81 75 93 123 139 115 97 69 ...

49 108 166 69 123 147 42 75 117 103 98 98 90 99 113]; Y_ORIG = [63 67 62 63 76 112 182 220 102 30 97 113 ...

113 38 21 14 30 109 50 37 29 26 26 46 38 25 ...

22 39 118 48 80 14 36 42 86 410 138 54 172 31 147 ...

204 90 55 24 70 78 141 94 64 43 36 163 145 69 90 ...

42 44 53 89 61 48 245 10 54 60 122 62 54 33 151 126 ...

64 33 82 94 74 244 60 47 57 65 71 102 130 104 135 105 ...

117 56 50 105 100 113 104 75 92 108 66 94 106 50 177 ...

98 55 102 98 97 133 93 147]; X_AVR = 99.898648648648650; Y_AVR = 87.477477477477490; CORR_STDX = 42.429909837167640; CORR_STDY = 62.765142489764250; n = 111;

%%Пункт 1. Нормирование точек

% Нормирование

X_NORM = randi(1, 1, n); Y_NORM = randi(1, 1, n); for i = 1 : n

X_NORM(i) = (X_ORIG(i) - X_AVR) / CORR_STDX; Y_NORM(i) = (Y_ORIG(i) - Y_AVR) / CORR_STDY;

end;

% Отображение

scatter(X_NORM, Y_NORM, 'filled'); hold on;

%%Определение "грубой" верхней оценки количества k кластеров fraction = sqrt(n / 2);

k = fix(fraction);

%%Алгоритм кластеризации k-means

%начальные центроиды hold on;

CENTERS_X = zeros(1, k); CENTERS_Y = zeros(1, k); for i = 1 : k

CENTERS_X(i) = X_NORM(i); CENTERS_Y(i) = Y_NORM(i);

end;

CLASTERS = zeros(k, (n + 1)); ds = randi(1, 1, k);

%алгоритм k-means

11

revision = 0; while(revision ~= k)

for j = 1 : k for r = 1 : n

CLASTERS(j, r) = 0;

end;

end;

for i = 1 : n for j = 1 : k

sqr_x = (X_NORM(i) - CENTERS_X(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y(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(CLASTERS(index, j) ~= 0) j = j + 1;

end;

CLASTERS(index, j) = i;

end;

revision = 0; for i = 1 : k r = 1;

summa_x = 0; summa_y = 0;

while((CLASTERS(i, r) ~= 0) && (r <= n)) num = CLASTERS(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_X(i) && new_center_y == CENTERS_Y(i))

revision = revision + 1;

else

CENTERS_X(i) = new_center_x; CENTERS_Y(i) = new_center_y;

end;

end;

end;

% отображение кластеров на графике

CLS = zeros((2 * k), (n + 1)); for i = 1 : (2 * k)

a = i / 2;

12

b = a - fix(a); if(b ~= 0)

j = 1;

while(CLASTERS((fix(a) + 1), j) ~= 0)

CLS(i, j) = X_NORM(CLASTERS((fix(a) + 1), j)); j = j + 1;

end;

else

j = 1;

while(CLASTERS((fix(a)), j) ~= 0)

CLS(i, j) = Y_NORM(CLASTERS(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)

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]);

13

end;

j = j + 1;

end;

i = i + 2;

end;

plot(CENTERS_X, CENTERS_Y, 'p', 'MarkerEdgeColor', 'r', 'MarkerFaceColor', 'r');

%% Алгоритм кластеризации k-medoids % начальные центроиды

hold on;

CENTERS_X2 = zeros(1, k); CENTERS_Y2 = zeros(1, k); for i = 1 : k

CENTERS_X2(i) = X_NORM(i);

CENTERS_Y2(i) = Y_NORM(i);

end;

CLASTERS2 = zeros(k, (n + 1)); ds2 = randi(1, 1, k); min_costs = zeros(1, k); CENTROIDS = zeros(1, k);

for o = 1 : k min_costs(o) = 10000; for r = 1 : n

rev = 0;

for i = 1 : k

if((X_NORM(r) ~= CENTERS_X2(i)) || (Y_NORM(r) ~= CEN-

TERS_Y2(i)))

rev = 1;

end;

end;

if(rev == 1)

CENTERS_X2(o) = X_NORM(r);

CENTERS_Y2(o) = Y_NORM(r);

end;

for j = 1 : k

for p = 1 : n CLASTERS2(j, p) = 0;

end;

end; cost = 0;

for i = 1 : n

for j = 1 : k

sqr_x = (X_NORM(i) - CENTERS_X2(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y2(j)) ^ 2; ds2(j) = sqrt(sqr_x + sqr_y);

end;

min_d = 100; index = 0; for j = 1 : k

if (ds2(j) < min_d) min_d = ds2(j); index = j;

end;

14

end; j = 1;

while(CLASTERS2(index, j) ~= 0) j = j + 1;

end;

CLASTERS2(index, j) = i; cost = cost + min_d;

end;

if(cost < min_costs(o)) min_costs(o) = cost; CENTROIDS(o) = r;

end;

end;

CENTERS_X2(o) = X_NORM(CENTROIDS(o));

CENTERS_Y2(o) = Y_NORM(CENTROIDS(o));

end;

for j = 1 : k

for p = 1 : n CLASTERS2(j, p) = 0;

end;

end;

for i = 1 : n

for j = 1 : k

sqr_x = (X_NORM(i) - CENTERS_X2(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y2(j)) ^ 2; ds2(j) = sqrt(sqr_x + sqr_y);

end;

min_d = 100; index = 0; for j = 1 : k

if (ds2(j) < min_d) min_d = ds2(j); index = j;

end;

end;

j = 1;

while(CLASTERS2(index, j) ~= 0) j = j + 1;

end;

CLASTERS2(index, j) = i;

end;

% отображение кластеров на графике

CLS2 = zeros((2 * k), (n + 1)); for i = 1 : (2 * k)

a = i / 2;

b = a - fix(a); if(b ~= 0)

j = 1;

while(CLASTERS2((fix(a) + 1), j) ~= 0)

CLS2(i, j) = X_NORM(CLASTERS2((fix(a) + 1), j)); j = j + 1;

end;

else

15

j = 1;

while(CLASTERS2((fix(a)), j) ~= 0)

CLS2(i, j) = Y_NORM(CLASTERS2(fix(a), j)); j = j + 1;

end;

end;

end; i = 1;

while(i < (2 * k)) j = 1;

while(CLS2(i, j) ~= 0) if(i == 1)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0 0.4470 0.7410] , ...

'MarkerFaceColor', [0 0.4470 0.7410]);

end;

if(i == 3)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0.8500 0.3250 0.0980] , ...

'MarkerFaceColor', [0.8500 0.3250 0.0980]);

end;

if(i == 5)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0.9290 0.6940 0.1250] , ...

'MarkerFaceColor', [0.9290 0.6940 0.1250]);

end;

if(i == 7)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0.4940 0.1840 0.5560] , ...

'MarkerFaceColor', [0.4940 0.1840 0.5560]);

end;

if(i == 9)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0.4660 0.6740 0.1880] , ...

'MarkerFaceColor', [0.4660 0.6740 0.1880]);

end;

if(i == 11)

plot(CLS2(i, j), CLS2((i + 1), j), 'o', 'MarkerEdgeColor', [0.3010 0.7450 0.9330] , ...

'MarkerFaceColor', [0.3010 0.7450 0.9330]);

end;

if(i == 13)

plot(CLS2(i, j), CLS2((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_X2, CENTERS_Y2, 'p', 'MarkerEdgeColor', 'w', 'MarkerFaceColor', 'w');

%% Пункт 5. Метод локтя.

16

% для k-means k = 50;

CLS_SUMS = zeros(1, k); F_SUMS = zeros(1, k); for s = 1 : k

CENTERS_X = zeros(1, s); CENTERS_Y = zeros(1, s); for i = 1 : s

CENTERS_X(i) = X_NORM(i);

CENTERS_Y(i) = Y_NORM(i);

end;

CLASTERS = zeros(s, (n + 1)); ds = randi(1, 1, s);

% алгоритм k-means revision = 0; while(revision ~= s)

for j = 1 : s

for r = 1 : n CLASTERS(j, r) = 0;

end;

end;

for i = 1 : n

for j = 1 : s

sqr_x = (X_NORM(i) - CENTERS_X(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y(j)) ^ 2; ds(j) = sqrt(sqr_x + sqr_y);

end;

min_d = 100; index = 0; for j = 1 : s

if (ds(j) < min_d) min_d = ds(j); index = j;

end;

end; j = 1;

while(CLASTERS(index, j) ~= 0) j = j + 1;

end;

CLASTERS(index, j) = i;

end;

F = zeros(1, s); C = zeros(1, s); summa1 = 0;

for i = 1 : s count = 0; j = 1;

sum_in_claster = 0; while(CLASTERS(i, j) ~= 0)

a1 = (X_NORM(CLASTERS(i, j)) - CENTERS_X(i)) ^ 2; a2 = (Y_NORM(CLASTERS(i, j)) - CENTERS_Y(i)) ^ 2; sum_in_claster = sum_in_claster + (a1 + a2);

17

count = count + 1; j = j + 1;

end;

F(i) = sum_in_claster; C(i) = count;

summa1 = summa1 + C(i) * F(i);

end;

summa1 = summa1 / n; F_SUMS(s) = summa1;

revision = 0; for i = 1 : s r = 1;

summa_x = 0; summa_y = 0;

while((CLASTERS(i, r) ~= 0) && (r <= n)) num = CLASTERS(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_X(i) && new_center_y == CENTERS_Y(i))

revision = revision + 1;

else

CENTERS_X(i) = new_center_x; CENTERS_Y(i) = new_center_y;

end;

end;

end;

for i = 1 : s j = 1;

sum_in_claster = 0; while(CLASTERS(i, j) ~= 0)

a1 = (X_NORM(CLASTERS(i, j)) - CENTERS_X(i)) ^ 2; a2 = (Y_NORM(CLASTERS(i, j)) - CENTERS_Y(i)) ^ 2; sum_in_claster = sum_in_claster + (a1 + a2);

j = j + 1;

end;

CLS_SUMS(s) = CLS_SUMS(s) + sum_in_claster;

end;

end;

% для k-medoids CLS_SUMS2 = zeros(1, k); F_SUMS2 = zeros(1, k); for s = 1 : k

CENTERS_X2 = zeros(1, k); CENTERS_Y2 = zeros(1, k); for i = 1 : s

CENTERS_X2(i) = X_NORM(i);

CENTERS_Y2(i) = Y_NORM(i);

18

end;

CLASTERS2 = zeros(s, (n + 1)); ds2 = randi(1, 1, s); min_costs = zeros(1, s); CENTROIDS = zeros(1, s);

for o = 1 : s min_costs(o) = 10000; for r = 1 : n

rev = 0;

for i = 1 : s

if((X_NORM(r) ~= CENTERS_X2(i)) || (Y_NORM(r) ~=

CENTERS_Y2(i)))

rev = 1;

end;

end;

if(rev == 1)

CENTERS_X2(o) = X_NORM(r);

CENTERS_Y2(o) = Y_NORM(r);

end;

for j = 1 : s for p = 1 : n

CLASTERS2(j, p) = 0;

end;

end; cost = 0;

for i = 1 : n for j = 1 : s

sqr_x = (X_NORM(i) - CENTERS_X2(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y2(j)) ^ 2; ds2(j) = sqrt(sqr_x + sqr_y);

end;

min_d = 100; index = 0; for j = 1 : s

if (ds2(j) < min_d) min_d = ds2(j); index = j;

end;

end; j = 1;

while(CLASTERS2(index, j) ~= 0) j = j + 1;

end;

CLASTERS2(index, j) = i; cost = cost + min_d;

end;

if(cost < min_costs(o)) min_costs(o) = cost; CENTROIDS(o) = r;

end;

end;

CENTERS_X2(o) = X_NORM(CENTROIDS(o));

CENTERS_Y2(o) = Y_NORM(CENTROIDS(o));

19

end;

for j = 1 : s for p = 1 : n

CLASTERS2(j, p) = 0;

end;

end;

for i = 1 : n for j = 1 : s

sqr_x = (X_NORM(i) - CENTERS_X2(j)) ^ 2; sqr_y = (Y_NORM(i) - CENTERS_Y2(j)) ^ 2; ds2(j) = sqrt(sqr_x + sqr_y);

end;

min_d = 100; index = 0; for j = 1 : s

if (ds2(j) < min_d) min_d = ds2(j); index = j;

end;

end; j = 1;

while(CLASTERS2(index, j) ~= 0) j = j + 1;

end;

CLASTERS2(index, j) = i;

end;

F2 = zeros(1, s);

C2 = zeros(1, s); summa2 = 0;

for i = 1 : s count2 = 0; j = 1;

sum_in_claster = 0; while(CLASTERS2(i, j) ~= 0)

a1 = (X_NORM(CLASTERS2(i, j)) - CENTERS_X2(i)) ^ 2; a2 = (Y_NORM(CLASTERS2(i, j)) - CENTERS_Y2(i)) ^ 2; sum_in_claster = sum_in_claster + (a1 + a2);

count2 = count2 + 1; j = j + 1;

end;

F2(i) = sum_in_claster; C2(i) = count2;

summa2 = summa2 + C2(i) * F2(i);

end;

summa2 = summa2 / n; F_SUMS2(s) = summa2;

for i = 1 : s j = 1;

sum_in_claster = 0; while(CLASTERS2(i, j) ~= 0)

a1 = (X_NORM(CLASTERS2(i, j)) - CENTERS_X2(i)) ^ 2;

20