PDA

Visualizza la versione completa : [MATLAB] Esercizio su Clustering e indice di Fowlkess-Mallows


Kanuc
12-11-2017, 19:31
Testo
Sia dato il dataset ”Glass” che memorizza una matrice V di 214x9 valori reali che
rappresentano 214 superfici di 7 tipi diversi di vetro misurate mediante 9 attributi. Tale
dataset viene forntio tramite il file glass.zip che contiene una descrizione pi´u dettagliata
del dataset (names.txt) e i dati numerici (data.txt).
Si richiede di implementare in matlab una metodologia che consenta di trovare la
migliore associazione algoritmo di clustering-distanza utilizzata, facendo uso di
(a) Quattro algoritmi di clustering distinti, di cui almeno uno partizionale (es. kmeans).
(b) Cinque distanze scelte a piacere, di cui almeno una euclidea.
(c) L’indicee di validazione FM che consente di misurare la bont´a del partizionamento
ottenuto rispetto alla gold solution.
In particolare, si richiede di (1) inglobare ognuna delle cinque distanze scelte su ognuno
dei quattro algoritmi di clustering (2) calcolare l’indice di validazione su ogni possibile
accoppiamento algoritmo-distanza considerando il dataset in oggetto come input.
Si consideri che l’algoritmo k-means dipende dalla inizializzazione, pertanto occorre
fornire il valore dell’indice di validazione mediato su pi´u esecuzioni dell’algoritmo.
Fornire inoltre opportuni grafici esplicativi a supporto della soluzione trovata.

Il codice:

%Si utilizzano 4 algoritmi di clustering:
%1.Singlelink
%2.Completelink
%3.AverageLink
%4.Kmeans


%Si utilizzano 5 distanze: cityblock,cosine,correlation,euclidean,chebychev


%OUTPUT:


%20 grafici che rappresentano i cluster trovati per ogni accoppiata
%algoritmo-distanza utilizzata


%2 grafici esplicativi che rappresentano i valori del cluster purity per
%ogni accoppiata algoritmo-distanza utilizzato


%Variabile CP contiene il cluster purity più vicino all'1


%La cella clusterpurity contiene l'accoppiata migliore per gli algoritmi
%gerarchici utilizzati


%La cella clusterpuritykmeans contiene la distanza migliore per l'algoritmo
%kmeans








clear all
close all
%Si importa il dataset data.txt
filename = 'data.txt';
delimiterIn = ',';
X = importdata(filename,delimiterIn);
[NELEMENTI ATTRIBUTI]=size(X);
%Si ricava la gold solution e la inserisco nel vettore colonna Gold
Gold=X(:,11);


%Si crea una cella che conterrà i partizionamenti relativi alla g.s.
Perfect={};


%Si elimina la prima colonna (gli indici degli elementi) e l'ultima
%colonna(gold solution)
X(:,1)=[ ];
X(:,10)=[ ];
%Si esplorano tutti i cluster
for k=1:7
%Si trovano tutti gli indici degli elementi che sono nel cluster k
I=find(Gold==k);
%Si assegna a Perfect{k} tali elementi
Perfect{k}=X(I,:);
end




%Nella cella Perfect si avrà il partizionamento perfetto degli elementi.Questo
%servirà per confrontarlo con i clustering per misurare la bontà di
%ogni partizionamento rispetto alla gold solution


%Metodi di clustering gerarchico utilizzati
metodi={'single','complete','average'}
%Distanze utilizzate
distanze={'cityblock','cosine','correlation','eucl idean','chebychev'}


%i=3;
%j=5;
%Si inizializzano le seguenti variabili
%In Grap ci saranno i 20 CP relativi alle coppie algoritmo-distanza
Grap=[];
cont=0;
Val={};
max=0;
somma=0;
elemcom=0;
CP=0;
for i=1:length(metodi)
for j=1:length(distanze)

%Dato il dataset X di N elementi
%Calcola la matrice delle distanze(similarità) di dimensione NxN(214x214)
D=pdist(X,distanze{j});


%Calcola il dendrogramma Z tramite i paradigmi
Z=linkage(D,metodi{i});


%Si visualizza il dendrogramma
%dendrogram(Z);




%Si trova sul dendrogramma il partizionamento
%con K cluster, L è tale che L(i) è l'indice
%del cluster di appartenenza dell'elemento X(i,:)
K=6;
L=cluster(Z,'maxclus',K);


%Si trovano i sottoinsiemi (cluster) del partizionamento (clustering)
C={};


%Si esplorano tutti i cluster
for k=1:6
%Si trovano tutti gli indici degli elementi che sono nel cluster k
I=find(L==k);
%Si assegnano a C{k} tali elementi
C{k}=X(I,:);
end


%Indice di validazione esterna: CLUSTER PURITY
%CP= 1/N * SOMMATORIA di max intersezione C(k) e Perfect(z)
%N=numero elementi (214)
%Intersezione tra ogni cluster e ogni singolo partizionamento della g.s.
%Si ricava il massimo numero di elementi tra ogni cluster e tutti i
%partizionamenti della g.s. e si sommano i massimi. Poi si divide per N






for h=1:6
for z=1:7

%A ogni ciclo si crea una nuova cella contenente un singolo
%partizionamento
G=C(h);
%Il partizionamento si assegna a F che è una matrice
F=G{1,1};
%Identica situazione per i partizionamenti dell g.s.
Pe=Perfect(z);
Q=Pe{1,1};
%Si richiama la funzione Intersect passandogli le due matrici in
%questione
%La funzione tornerà il numero di elementi in comune tra le due
%matrici (confronto fra righe: se la riga di F è uguale almeno a una
%riga di Q allora si avrà già un elemento in comune)
%Si procede per tutti i partizionamenti (C(1) int P(1), C(1) int
%P(2) ...
elemcom=Intersect(F,Q);

%Si salva il massimo di ogni singola partizione da confrontare con
%tutti i cluster della g.s.
if(elemcom > max)
max=elemcom;
end

end
%Si sommano i massimi: MAX C(1) int P(z) + MAX C(2) int P(z) +..
somma=somma+max;
max=0;
end


max=0;


CPsingolo=somma/NELEMENTI;
%Si ottiene il CP migliore fra tutte le accoppiate algoritmo-distanze
if(CPsingolo > CP )
CP=CPsingolo;
Clusterpurity={metodi(i),distanze(j),CP};
end
somma=0;
elemcom=0;
%Nella cella Val si avranno le informazioni sui singoli cp da quale
%accoppiata derivano
Val{i,j}={metodi(i),distanze(j),CPsingolo};
cont=cont+1;
%Si aggiunge al vettore Grap il cp trovato
Grap(cont)=CPsingolo;


name=['Algoritmo ' metodi{i} ' con distanza ' distanze{j}];
figure('Name',name);
plot(L,'*');


end
end


%figure('Name','valori CP Algoritmi di clustering gerarchico');
%bar(SortGrap)


%Si richiama lo script algomeans
algomeans




%GRAFICI ESPLICATIVI




%Dal vettore si crea una matrice
[grafico,padded] = vec2mat(Grap,5);


%Raggruppamento per algoritmi utilizzati
figure('Name','valori CP raggruppati per algoritmi ');
bar(grafico)
title('1=Singlelink 2=Completelink 3=Averagelink 4=Kmeans')
vetstringhe={'cityblock' 'cosine' 'correlation' 'euclidean' 'chebychev'};
legend(vetstringhe);


%Raggruppamento per distanze utilizzate
trasp=grafico.';
figure('Name','valori CP raggruppati per distanze ');
bar(trasp)
title('1=cityblock 2=cosine 3=correlation 4=euclidean 5=chebychev')
vetstringhe={'Singlelink' 'Completelink' 'Averagelink' 'Kmeans'};
legend(vetstringhe);



La consegna chiede di usare come indice di validazione il FM cioè indice di FOWLKESS-MALLOWS mentre in questo programma è stato utilizzato il CP cioè CLUSTER PURITY. Qualcuno può aiutarmi a fare questa modifica inserendo la funzione apposita? Please!!!

Loading