Загрузка данных


% ЛБ1, часть 2: нечёткий кластерный анализ (FCM), вариант 5
clear; clc; close all;

%% 1. Исходные данные: объекты x признаки
% Признаки: [длительность, дн | стоимость, тыс.руб | число сбоев]
X = [ 5 12 1;  6 13 2;  7 11 1;  5 14 2;  6 12 1;
      8 15 2;  7 13 1;  6 11 2; 10 20 4; 12 24 5;
     11 22 4; 16 32 7; 18 35 8; 15 30 6; 17 34 8;
     19 36 7; 16 31 6; 18 33 8; 20 38 9; 17 32 7];
[M, n] = size(X);            % M объектов, n признаков

% Если данные из Excel: сохрани CSV (точки, не запятые) и раскомментируй:
% X = readmatrix('data.csv');  [M, n] = size(X);

%% 2. Статистический метод классификации (k-средних)
c = 2;                                   % число кластеров
[idxK, Ck] = kmeans(X, c, 'Replicates', 10);

% Контроль: иерархическая кластеризация (тоже статистический метод)
D    = pdist(X, 'euclidean');            % евклидова метрика
Z    = linkage(D, 'average');
idxH = cluster(Z, 'maxclust', c);

%% 3. Нечёткий кластерный анализ FCM
m   = 2;                                 % коэффициент нечёткости
[centers, U, objFcn] = fcm(X, c, [m, 100, 1e-5, 0]);
% U — матрица степеней принадлежности (c x M), centers — центры кластеров

% Жёсткое разбиение из нечёткого: объект -> кластер с max принадлежностью
[~, idxF] = max(U, [], 1);
idxF = idxF(:);

%% 4. Сравнение методов
acc = max(mean(idxF == idxK), mean(idxF == (c + 1 - idxK))); % учёт перенумерации
fprintf('Совпадение разбиений FCM и k-means: %.1f%%\n', 100*acc);

fprintf('\nОбъект | k-means | иерарх. | FCM | mu1    | mu2\n');
for k = 1:M
    fprintf(' %5d |   %d     |    %d    |  %d  | %.3f | %.3f\n', ...
            k, idxK(k), idxH(k), idxF(k), U(1,k), U(2,k));
end

fprintf('\n"Размытые" объекты (0.1 < mu < 0.9) — суть нечёткого подхода:\n');
for k = 1:M
    if U(1,k) > 0.1 && U(1,k) < 0.9
        fprintf('  объект %2d: mu1 = %.3f, mu2 = %.3f\n', k, U(1,k), U(2,k));
    end
end

%% 5. Графики
figure(1);
subplot(1,2,1);
gscatter(X(:,1), X(:,2), idxK, 'rb', 'ox', 8); hold on;
plot(Ck(:,1), Ck(:,2), 'k^', 'MarkerSize', 11, 'LineWidth', 2);
grid on; xlabel('Длительность, дн'); ylabel('Стоимость, тыс. руб');
title('Статистический метод (k-means)'); legend('кл.1','кл.2','центры');
subplot(1,2,2);
gscatter(X(:,1), X(:,2), idxF, 'rb', 'ox', 8); hold on;
plot(centers(:,1), centers(:,2), 'k^', 'MarkerSize', 11, 'LineWidth', 2);
grid on; xlabel('Длительность, дн'); ylabel('Стоимость, тыс. руб');
title('Нечёткий метод FCM (по max mu)'); legend('кл.1','кл.2','центры');

figure(2);
subplot(2,1,1);
bar(U'); grid on;
xlabel('Номер объекта'); ylabel('\mu_{ik}');
title('Матрица степеней принадлежности U (FCM)');
legend('кластер 1', 'кластер 2');
subplot(2,1,2);
plot(objFcn, 'LineWidth', 1.5); grid on;
xlabel('Итерация'); ylabel('J(X,U,V)');
title('Сходимость целевой функции FCM');