clearvars close all clc %% load creatinina_bis %% % Visualizzazione dei dati figure; boxplot(data); title('Dati generati'); xlabel('Asse X'); ylabel('Asse Y'); grid on; % Calcolo della matrice di distanza (distanza euclidea) distanceMatrix = pdist(data, 'euclidean'); %% % Applicazione del clustering gerarchico con metodo di Ward linkageMatrix = linkage(distanceMatrix, 'complete'); % Generazione del dendrogramma figure; H=dendrogram(linkageMatrix, 'Orientation', 'top'); % Dendrogramma verticale set(H,'LineWidth',2) fontsize(16,"points") title('Dendrogramma gerarchico (metodo complete)'); xlabel('Posizione dei dati nel vettore Dati'); ylabel('Distanza'); %% % Calcolo delle distanze cophenetiche [cophDist, copheneticCorr] = cophenet(linkageMatrix, distanceMatrix); %r = corr(distanceMatrix',copheneticCorr','type','spearman'); %% % Calcolo indice di inconsistenza inconsistencyMatrix = inconsistent(linkageMatrix); % Visualizzazione della matrice di inconsistenza disp('Matrice di inconsistenza:'); disp(inconsistencyMatrix); % Definizione di una soglia per l'indice di inconsistenza threshold = 1.0; % Cambiare in base al dataset e al livello desiderato di separazione % Taglio del dendrogramma in base alla soglia clusters = cluster(linkageMatrix, 'cutoff', threshold, 'criterion', 'inconsistent'); uniqueClusters = unique(clusters); % Identifica i cluster unici numClusters = length(uniqueClusters); % Numero di cluster % Visualizzazione del dendrogramma con taglio figure; H=dendrogram(linkageMatrix, 'ColorThreshold', threshold); set(H,'LineWidth',2) fontsize(16,"points") title(['Dendrogramma con soglia di inconsistenza = ', num2str(threshold)]); xlabel('Punti'); ylabel('Distanza'); % % Visualizzazione dei cluster ottenuti % disp('Cluster assegnati ai dati:'); % disp(clusters); %% % Definizione di un intervallo di soglie da esplorare thresholdValues = 0.01:0.01:5; % Inizializzazione delle variabili per memorizzare i risultati silhouetteScores = zeros(length(thresholdValues), 1); % Loop sulle soglie for i = 1:length(thresholdValues) % Taglio del dendrogramma con la soglia corrente clusters = cluster(linkageMatrix, 'cutoff', thresholdValues(i), 'criterion', 'inconsistent'); % Calcolo del silhouette score (solo se ci sono più di 1 cluster) if length(unique(clusters)) > 1 silScore = mean(silhouette(data, clusters, 'Euclidean')); else silScore = -Inf; % Non valido se c'è un solo cluster end silhouetteScores(i) = silScore; clear silScore end % Grafico della qualità del clustering in funzione della soglia figure; plot(thresholdValues, silhouetteScores, '-o', 'LineWidth', 2); title('Silhouette Score vs. Soglia di inconsistenza'); xlabel('Soglia di inconsistenza'); ylabel('Silhouette Score'); grid on; %% % Taglio del dendrogramma in base alla soglia clusters = cluster(linkageMatrix, 'MaxClust',5); %% % Grafico dei dati con i cluster e i centroidi uniqueClusters = unique(clusters); % Identifica i cluster unici numClusters = length(uniqueClusters); % Numero di cluster centroids = zeros(numClusters); % Preallocazione for i = 1:numClusters % Trova gli indici dei punti appartenenti al cluster corrente clusterPoints = data(clusters== uniqueClusters(i), :); % Calcola il centroide come media dei punti centroids(i, :) = mean(clusterPoints, 1); end