Laboratorio Matlab: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
(Cluster Analysis: Self-Organizing Maps)
(Materiale per il Corso di Bioinformatica Avanzata in attesa di pagina specifica)
 
(20 versioni intermedie di uno stesso utente non sono mostrate )
Riga 1: Riga 1:
 +
== Apprendimento Supervisionato ==
 
=== Reti Neurali Feed-Forward ===
 
=== Reti Neurali Feed-Forward ===
 
Esempio di applicazione di reti neurali artificiali.
 
Esempio di applicazione di reti neurali artificiali.
Riga 10: Riga 11:
 
temp = [x;t];
 
temp = [x;t];
 
rng(0)
 
rng(0)
p = randperm(size(temp,2));
+
p = randperm(size(temp,2)); % Genero un vettore di permutazioni casuali
  
train_size = floor(size(temp,2)*.8);
+
train_size = floor(size(temp,2)*.8); % Percentuale di dati per il primo subset
p_train = p(1:train_size);
+
p_train = p(1:train_size); % Seleziono la percentuale di indici per il primo subset
p_test = p(train_size+1:end);
+
p_test = p(train_size+1:end); % Seleziono la percentuale di indici per il secondo subset
  
 +
% Divisione del dataset
 
x_train = temp(1:9,p_train);
 
x_train = temp(1:9,p_train);
 
t_train = temp(10,p_train);
 
t_train = temp(10,p_train);
Riga 22: Riga 24:
 
t_test = temp(10,p_test);
 
t_test = temp(10,p_test);
  
 +
% Salvataggio del dataset
 
save('dataset2.mat','x_train','t_train','x_test','t_test')
 
save('dataset2.mat','x_train','t_train','x_test','t_test')
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Implementazione della rete neurale:
+
Implementazione rete neurale:
 
<syntaxhighlight lang="matlab" line>
 
<syntaxhighlight lang="matlab" line>
 
load dataset2.mat
 
load dataset2.mat
Riga 78: Riga 81:
  
 
% Plots vari
 
% Plots vari
 +
figure, plotperform(tr) % Andamento errori
 +
figure, plotconfusion(t_train,y_train),title('Training Confusion Matrix')  % Matrice di confusione
 +
%figure, plotroc(t,y)  % ROC
 +
 +
%% Test Rete
 +
y_test = net(x_test);
 +
figure, plotconfusion(t_test,y_test),title('Test Confusion Matrix')  % Matrice di confusione
 +
</syntaxhighlight>
 +
 +
=== Traccia ed esempio svolto a lezione (1) ===
 +
 +
* Utilizzando il dataset "cancer_dataset" già presente in Matlab, implementare un classificatore binario con un solo layer formato da 10 neuroni, ’traingdx’ come funzione di addestramento e ‘mse’ come funzione errore. Utilizzare il validation set come criterio di stop (numero massimo di fallimenti pari a 20) e 1000 epoche come numero massimo di iterazioni. Impostare, inoltre, ‘tansig’ e ‘logsig’ rispettivamente come funzioni di attivazione del primo layer nascosto e del layer di uscita.<br>Si rappresenti la matrice di confusione sul test set.
 +
* Salvare le matrici dei pesi, inizializzare la rete e ripetere l’addestramento senza validation set.<br>Rappresentare nuovamente la matrice di confusione sul test set.
 +
 +
<syntaxhighlight lang="matlab" line>
 +
%% Caricamento del dataset
 +
load cancer_dataset.mat
 +
 +
x = cancerInputs;
 +
t = cancerTargets;
 +
 +
disp(['# Features: ',num2str(size(x,1))])
 +
disp(['# Samples: ',num2str(size(x,2))])
 +
 +
%% Split dataset
 +
rng(0)
 +
test_rate = .15;
 +
idx = randperm(size(x,2));
 +
test_n = floor(test_rate*size(x,2));
 +
test_idx = idx(1:test_n);
 +
non_test_idx = idx(test_n+1:end);
 +
 +
x_test = x(:,test_idx);
 +
t_test = t(:,test_idx);
 +
 +
x = x(:,non_test_idx);
 +
t = t(:,non_test_idx);
 +
 +
%% Creazione rete
 +
 +
% Layers nascosti
 +
hiddenLayerSize = [10];
 +
 +
% Training Function - help nntrain
 +
trainFcn = 'traingdx'; % traingda, traingdm, traingd
 +
 +
% Creazione rete
 +
net = patternnet(hiddenLayerSize, trainFcn);
 +
 +
% Suddivisione dataset
 +
net.divideFcn = 'dividerand';
 +
net.divideParam.trainRatio = .8;
 +
net.divideParam.valRatio = .2;
 +
net.divideParam.testRatio = 0;
 +
 +
% Criteri di stop
 +
net.trainParam.epochs = 1000;
 +
net.trainParam.max_fail = 20;
 +
 +
% Funzione errore
 +
net.performFcn = 'mse';
 +
 +
% Funzioni di attivazione
 +
net.layers{1}.transferFcn = 'tansig';
 +
net.layers{end}.transferFcn = 'logsig';
 +
 +
%% Inizializzazione Rete
 +
net = configure(net,x,t);
 +
net = init(net);
 +
view(net)
 +
 +
%% Addestramento Rete
 +
[net,tr] = train(net,x,t);
 +
 +
y = net(x);
 
figure, plotperform(tr)
 
figure, plotperform(tr)
%figure, plottrainstate(tr)
+
figure, plotconfusion(t,y,'Training 1')   % Matrice di confusione
%figure, ploterrhist(e)
+
figure, plotconfusion(t_train,y_train),title('Training Confusion Matrix')
+
%figure, plotroc(t,y)
+
  
 
%% Test Rete
 
%% Test Rete
 
y_test = net(x_test);
 
y_test = net(x_test);
figure, plotconfusion(t_test,y_test),title('Test Confusion Matrix')
+
figure, plotconfusion(t_test,y_test,'Test 1')   % Matrice di confusione
 +
 
 +
%% Senza validation (punto 2)
 +
 
 +
% Salvataggio matrici dei pesi
 +
LW = net.LW;
 +
IW = net.IW;
 +
 
 +
net.divideFcn = 'dividetrain';
 +
net = init(net);
 +
[net,tr] = train(net,x,t);
 +
 
 +
y = net(x);
 +
figure, plotperform(tr)
 +
figure, plotconfusion(t,y,'Training 2')  % Matrice di confusione
 +
 
 +
y_test = net(x_test);
 +
figure, plotconfusion(t_test,y_test,'Test 2')   % Matrice di confusione
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== Traccia ed esempio svolto a lezione (2) ===
  
 +
Da una osservazione effettuata su pazienti afferenti ad una struttura ospedaliera si vuole dedurre il periodo di degenza.<br>Sono state effettuate le seguenti osservazioni:
  
 +
# media degenza per un paziente anziano soggetto ad intervento, con complicanze e con patologie pregresse non rilevanti;
 +
# media degenza per un paziente adulto soggetto ad intervento, con complicanze e con patologie pregresse;
 +
# degenza giornaliera per un paziente adulto soggetto ad intervento, con complicanze e senza patologie pregresse;
 +
# degenza giornaliera per paziente giovane soggetto ad intervento, con complicanze e con patologie pregresse non rilevanti;
 +
# lunga degenza per un paziente anziano soggetto ad intervento, senza complicanze e con patologie pregresse non rilevanti;
 +
# lunga degenza per un paziente adulto soggetto ad intervento, senza complicanze e con patologie pregresse;
 +
# media degenza per un paziente adulto non soggetto ad intervento e con patologie pregresse;
 +
# degenza giornaliera per un paziente giovane soggetto ad intervento, senza complicanze e senza patologie pregresse;
 +
# lunga degenza per un paziente anziano non soggetto ad intervento e con patologie pregresse;
 +
# media degenza per un paziente adulto soggetto ad intervento, senza complicanze e con patologie pregresse non note;
 +
# media degenza per un paziente giovane soggetto ad intervento, senza complicanze e con patologie pregresse;
 +
# media degenza per un paziente anziano non soggetto ad intervento e con patologie pregresse non note;
 +
# degenza giornaliera per un paziente adulto non soggetto ad intervento e senza patologie pregresse;
 +
# degenza giornaliera per un paziente giovane non soggetto ad intervento e con patologie pregresse non rilevanti
 +
 +
I dati in input sono:
 +
* presenza (P1=+1) o meno (P1=-1) di intervento chirurgico;
 +
* presenza di complicanze (P2=+1) o meno (P2=-1) dopo intervento chirurgico, in assenza di intervento P2=0;
 +
* presenza (P3=+1) o meno (P3=-1) di patologie pregresse, se non note o non rilevanti si porrà P3=0;
 +
* età P4 del paziente, con valori +1, 0, -1 rispettivamente con profilo "anziano", "adulto" o "giovane";
 +
 +
L'output T corrisponde al periodo di degenza, con valori +1, +0.5, 0 rispettivamente per "lunga", "media" o "giornaliera".
 +
 +
Tabella dei dati di input ed output realizzata secondo la codifica indicata:
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Feature 1
 +
! Feature 2
 +
! Feature 3
 +
! Feature 4
 +
! Target
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
|-
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
|-
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 1
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 1
 +
| style="text-align: center;" | 0.5
 +
|-
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0
 +
|-
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | 0
 +
| style="text-align: center;" | -1
 +
| style="text-align: center;" | 0
 +
|}
 +
 +
Implementazione rete:
 +
<syntaxhighlight lang="matlab" line>
 +
%% Esempio di risoluzione del problema del sistema esperto
 +
 +
P =[ 1 1 1 1 1 1 -1 1 -1 1 1 -1;
 +
    1 1 1 1 -1 -1 0 -1 0 -1 -1 0;
 +
    0 1 -1 0 0 1 1 -1 1 0 1 0;
 +
    1 0 0 -1 1 0 0 -1 1 0 -1 1];
 +
T = [ 0.5 0.5 0 0 1 1 0.5 0 1 0.5 0.5 0.5] ;
 +
 +
%test generalizzazione
 +
P13=[ -1 0  -1 0]';
 +
T13 = 0;
 +
% a213 deve essere prossimo T13;
 +
 +
P14=[-1 0  0 -1]';
 +
T14 = 0;
 +
% a214 deve essere prossimo T14;
 +
 +
%test robustezza (immunità al rumore)
 +
Pnoise=[0.8 0.8 0.1 0.8]';
 +
Tnoise = .5;
 +
% essendo Pnoise prossimo a P(1) Tnoise
 +
% deve essere prossimo T(1)
 +
 +
%% Creazione rete
 +
 +
% Layers nascosti
 +
hiddenLayerSize = [5];
 +
 +
% Training Function - help nntrain
 +
trainFcn = 'traingdx'; % traingda, traingdm, traingd
 +
 +
% Creazione rete
 +
net = patternnet(hiddenLayerSize, trainFcn);
 +
 +
% Suddivisione dataset
 +
net.divideFcn = 'dividetrain';
 +
 +
% Criteri di stop
 +
net.trainParam.epochs = 20000;
 +
net.trainParam.goal = 1e-4;
 +
 +
% Funzione errore
 +
net.performFcn = 'mse';
 +
 +
% Funzioni di attivazione
 +
net.layers{1}.transferFcn = 'logsig';
 +
net.layers{end}.transferFcn = 'logsig';
 +
 +
%% Inizializzazione Rete
 +
net = configure(net,P,T);
 +
rng(0)
 +
net = init(net);
 +
view(net)
 +
 +
%% Addestramento Rete
 +
[net,tr] = train(net,P,T);
 +
y = net(P)
 +
 +
%% Test Rete
 +
a = net(P);
 +
a13 = net(P13)
 +
a14 = net(P14)
 +
anoise = net(Pnoise)
 +
 +
</syntaxhighlight>
 +
 +
== Apprendimento Non Supervisionato ==
 
=== Cluster Analysis: Self-Organizing Maps ===
 
=== Cluster Analysis: Self-Organizing Maps ===
 
Implementazione rete SOM:
 
Implementazione rete SOM:
Riga 100: Riga 381:
 
[x,pca_settings] = processpca(x,0.15);    % PCA
 
[x,pca_settings] = processpca(x,0.15);    % PCA
  
clusters_number = 10;
+
% Dimensione
 +
dimensions = [10];
  
dimensions = [clusters_number];
+
% Creazione rete
 
net = selforgmap(dimensions);
 
net = selforgmap(dimensions);
 +
 +
% Visualizza rete
 +
net = configure(net,x);
 
view(net)
 
view(net)
  
 +
% Criteri di stop
 
net.trainParam.epochs = 2000;
 
net.trainParam.epochs = 2000;
 +
% Stampa output nella command line
 
net.trainParam.showCommandLine = 1;
 
net.trainParam.showCommandLine = 1;
  
 +
% Addestramento Rete
 
net = train(net,x);
 
net = train(net,x);
  
figure,plotsompos(net,x);
+
% Plots vari
figure,plotsomhits(net,x);
+
figure,plotsompos(net,x);   % Pesi neuroni
figure,plotsomnd(net,x);
+
figure,plotsomhits(net,x); % Numero di input che attivano ogni neurone
 +
figure,plotsomnd(net,x);   % Distanze neuroni
  
 +
% Indice del cluster (neurone) dato un input
 
y = net(x);
 
y = net(x);
 
cluster_indices = vec2ind(y);
 
cluster_indices = vec2ind(y);
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
 +
=== Cluster Analysis: k-Means ===
 +
Implementazione k-Means:
 +
<syntaxhighlight lang="matlab" line>
 +
 +
clear all, close all
 +
rng(0); % For reproducibility
 +
load dataset3.mat
 +
 +
[X,pca_settings] = processpca(X',0.15);
 +
X = X';
 +
 +
%% K-means
 +
K = 3;
 +
 +
% Rappresento i dati
 +
figure;
 +
plot(X(:,1),X(:,2),'k*','MarkerSize',5);
 +
grid minor
 +
xlabel 'F1';
 +
ylabel 'F2';
 +
 +
[idx,C] = kmeans(X,K);
 +
 +
% Rappresento i dati secondo i cluster individuati dall'applicazione del k-means
 +
figure;
 +
gscatter(X(:,1),X(:,2),idx);
 +
hold on
 +
plot(C(:,1),C(:,2),'kx','MarkerSize',15,'LineWidth',3);
 +
hold off
 +
legend('Region 1','Region 2','Region 3','C');
 +
 +
</syntaxhighlight>
 +
 +
== Dendrogramma ==
 +
Costruzione del dendrogramma partendo da dati generati casualmente:
 +
 +
<syntaxhighlight lang="matlab" line>
 +
%% Generazione dei dati
 +
rng(0) % For reproducibility
 +
N = 10; % Samples
 +
X = rand(N,2); % Dataset
 +
 +
%% Rappresentazione del dataset
 +
figure,plot(X(:,1),X(:,2),'*')
 +
grid minor
 +
txt = strsplit(num2str(1:N));
 +
text(X(:,1),X(:,2),txt,'FontSize',15)
 +
 +
%% Costruzione del dendrogramma
 +
tree = linkage(X,'average','euclidean'); % Creazione albero
 +
figure,dendrogram(tree)
 +
</syntaxhighlight>
 +
 +
== Test chi-quadro ==
 +
Si supponga di lanciare una moneta 10 volte e di ottenere 6 volte testa e 4 volte croce. È possibile affermare che la distribuzione dei risultati sia coerente con quella di una moneta non truccata?
 +
 +
Applicazione del test chi-quadro:
 +
<syntaxhighlight lang="matlab" line>
 +
obs = [4;6]; % Vettore delle osservazioni
 +
expt = [5;5]; % Vettore dei valori attesi
 +
df = 1; % Gradi di liberà
 +
 +
c = compute_chi(obs,expt);
 +
p = chi_table(.05,df);
 +
disp(c > p)
 +
 +
 +
%% Funzioni
 +
 +
% Calcolo del chi-quadro
 +
function c = compute_chi(obs,expt)
 +
c = sum((obs - expt).^2 ./ expt);
 +
%c = sum((abs(obs - expt)-.5).^2 ./ expt);
 +
end
 +
 +
% Inversa del chi-quadro fissati "df" gradi di libertà e "1-p" probabilità
 +
function C = chi_table(p,df)
 +
C = chi2inv(1-p,df);
 +
end
 +
</syntaxhighlight>
 +
 +
== t-Test ==
 +
Date le seguenti misure si verifichi, applicando t-Test con un livelli di significatività del 5%, se è possibile affermare che la popolazione provenga da una distribuzione normale con media pari a 5 e varianza non nota.
 +
 +
{| class="wikitable" border="1"
 +
! style="text-align: center;" | 5.53
 +
! style="text-align: center;" | 6.83
 +
! style="text-align: center;" | 2.74
 +
! style="text-align: center;" | 5.86
 +
! style="text-align: center;" | 5.31
 +
! style="text-align: center;" | 3.69
 +
! style="text-align: center;" | 4.56
 +
! style="text-align: center;" | 5.34
 +
! style="text-align: center;" | 8.57
 +
! style="text-align: center;" | 7.76
 +
! style="text-align: center;" | 3.65
 +
! style="text-align: center;" | 8.03
 +
! style="text-align: center;" | 5.72
 +
! style="text-align: center;" | 4.93
 +
! style="text-align: center;" | 5.71
 +
! style="text-align: center;" | 4.79
 +
! style="text-align: center;" | 4.87
 +
! style="text-align: center;" | 6.48
 +
! style="text-align: center;" | 6.40
 +
! style="text-align: center;" | 6.41
 +
! style="text-align: center;" | 5.67
 +
! style="text-align: center;" | 3.79
 +
! style="text-align: center;" | 5.71
 +
! style="text-align: center;" | 6.63
 +
! style="text-align: center;" | 5.48
 +
|}
 +
 +
<syntaxhighlight lang="matlab" line>
 +
% Dati
 +
x = [5.53,6.83,2.74,5.86,5.31,3.69,4.56,5.34,8.57,7.76,3.65,8.03,5.72,4.93,5.71,4.79,4.87,6.48,6.40,6.41,5.67,3.79,5.71,6.63,5.48];
 +
disp(['Media dati: ',num2str(mean(x))])
 +
 +
%% t-Test
 +
[ht,pp] = ttest(x,m,'Alpha',.05)
 +
 +
if ht
 +
    disp('Rifiuto ipotesì nulla')
 +
end
 +
 +
</syntaxhighlight>
 +
 +
== z-Test ==
 +
 +
Date le seguenti misure si verifichi, applicando z-Test con un livelli di significatività del 5%, se è possibile affermare che la popolazione provenga da una distribuzione con media pari a 5 e deviazione standard pari a 1.
 +
 +
{| class="wikitable" border="1"
 +
! style="text-align: center;" | 5.53
 +
! style="text-align: center;" | 6.83
 +
! style="text-align: center;" | 2.74
 +
! style="text-align: center;" | 5.86
 +
! style="text-align: center;" | 5.31
 +
! style="text-align: center;" | 3.69
 +
! style="text-align: center;" | 4.56
 +
! style="text-align: center;" | 5.34
 +
! style="text-align: center;" | 8.57
 +
! style="text-align: center;" | 7.76
 +
! style="text-align: center;" | 3.65
 +
! style="text-align: center;" | 8.03
 +
! style="text-align: center;" | 5.72
 +
! style="text-align: center;" | 4.93
 +
! style="text-align: center;" | 5.71
 +
! style="text-align: center;" | 4.79
 +
! style="text-align: center;" | 4.87
 +
! style="text-align: center;" | 6.48
 +
! style="text-align: center;" | 6.40
 +
! style="text-align: center;" | 6.41
 +
! style="text-align: center;" | 5.67
 +
! style="text-align: center;" | 3.79
 +
! style="text-align: center;" | 5.71
 +
! style="text-align: center;" | 6.63
 +
! style="text-align: center;" | 5.48
 +
|}
 +
 +
<syntaxhighlight lang="matlab" line>
 +
% Dati
 +
x = [5.53,6.83,2.74,5.86,5.31,3.69,4.56,5.34,8.57,7.76,3.65,8.03,5.72,4.93,5.71,4.79,4.87,6.48,6.40,6.41,5.67,3.79,5.71,6.63,5.48];
 +
disp(['Media dati: ',num2str(mean(x))])
 +
 +
%% z-Test
 +
sigma = 1;
 +
[hz,pz] = ztest(x,m,sigma,'Alpha',.05)
 +
 +
if hz
 +
    disp('Rifiuto ipotesì nulla')
 +
end
 +
 +
</syntaxhighlight>
 +
 +
 +
== Esame 4 luglio 2019 ==
 +
'''Traccia:'''
 +
 +
Si supponga di aver addestrato una rete neurale feedforward e di voler testare le performance su un nuovo dataset.
 +
La rete è stata addestrata usando la seguente configurazione:
 +
* un layer nascosto formato da 10 neuroni e avente come funzione di trasferimento "tansig";
 +
* un layer di uscita formato da un solo neurone e avente come funzione di trasferimento "logsig”.
 +
Successivamente all’addestramento, lo stato della rete è stato salvato all’interno di tre strutture dati Matlab IW, LW, b contenenti rispettivamente: i pesi in ingresso, i pesi del layer nascosto e i vettori di bias.
 +
Fissando, quindi, una soglia sull’output di classificazione pari a 0.5, si valutino le performance in termini di accuratezza sul nuovo dataset fornito.
 +
Si rappresentino successivamente le curve ROC relativamente ai valori di soglia: 0.1, 0.5 e 0.8.  Si commentino i risultati ottenuti.
 +
 +
N.B.: Tutte le variabili necessarie allo svolgimento sono contenute all’interno del file [https://www.dropbox.com/s/o2xr0xosmda64ft/esame.mat?dl=0 esame.mat] fornito.
 +
 +
Possibile soluzione per il ripristino di una rete:
 +
<syntaxhighlight lang="matlab" line>
 +
clear all, close all
 +
load esame.mat;
 +
 +
% Creazione rete
 +
net = patternnet([10]);
 +
net = configure(net,features,target);
 +
 +
% Funzioni di attivazione
 +
net.layers{1}.transferFcn = 'tansig';
 +
net.layers{end}.transferFcn = 'logsig';
 +
 +
% Pesi
 +
net.IW = IW;
 +
net.LW = LW;
 +
net.b = b;
 +
 +
% Test
 +
y_test = net(features);
 +
</syntaxhighlight>
 +
 +
Per la valutazione delle performance e delle curve ROC si rimanda al seguente [http://www.vitoantoniobevilacqua.it/materialedidattico/files/Human%20Machine%20Interaction/Labs/Lab2_1_ROC.pdf link]

Versione attuale delle 19:47, 25 ott 2019

Apprendimento Supervisionato

Reti Neurali Feed-Forward

Esempio di applicazione di reti neurali artificiali.

Creazione dataset:

  1. load cancer_dataset.mat
  2. x = cancerInputs;
  3. t = cancerTargets(1,:);
  4.  
  5. temp = [x;t];
  6. rng(0)
  7. p = randperm(size(temp,2)); % Genero un vettore di permutazioni casuali
  8.  
  9. train_size = floor(size(temp,2)*.8); % Percentuale di dati per il primo subset
  10. p_train = p(1:train_size); % Seleziono la percentuale di indici per il primo subset
  11. p_test = p(train_size+1:end); % Seleziono la percentuale di indici per il secondo subset
  12.  
  13. % Divisione del dataset
  14. x_train = temp(1:9,p_train);
  15. t_train = temp(10,p_train);
  16.  
  17. x_test = temp(1:9,p_test);
  18. t_test = temp(10,p_test);
  19.  
  20. % Salvataggio del dataset
  21. save('dataset2.mat','x_train','t_train','x_test','t_test')

Implementazione rete neurale:

  1. load dataset2.mat
  2.  
  3. disp(['# Features: ',num2str(size(x_train,1))])
  4. disp(['# Samples: ',num2str(size(x_train,2))])
  5.  
  6. %% Creazione rete
  7.  
  8. % Layers nascosti
  9. % hiddenLayerSize = [20];
  10. % hiddenLayerSize = [50];
  11. hiddenLayerSize = [20,10];
  12.  
  13.  
  14. % Training Function - help nntrain
  15. trainFcn = 'traingdx'; % traingda, traingdm, traingd
  16.  
  17. % Creazione rete
  18. net = patternnet(hiddenLayerSize, trainFcn);
  19.  
  20. % Suddivisione dataset
  21. net.divideFcn = 'dividerand';
  22. net.divideParam.trainRatio = 70/100;
  23. net.divideParam.valRatio = 30/100;
  24. net.divideParam.testRatio = 0/100;
  25.  
  26. % Criteri di stop
  27. net.trainParam.epochs = 5000;;
  28. %net.trainParam.max_fail = 20;
  29. %net.trainParam.min_grad = 0;%10e-5;
  30.  
  31. % Funzione errore
  32. net.performFcn = 'mse';
  33.  
  34. % Funzioni di attivazione
  35. net.layers{end}.transferFcn = 'logsig';
  36.  
  37. % Visualizza rete
  38. view(net)
  39.  
  40. %% Inizializzazione Rete
  41. rng(0)
  42. net = configure(net,x_train,t_train);
  43. net = init(net);
  44. init_LW = net.LW;
  45. init_IW = net.IW;
  46.  
  47. %% Addestramento Rete
  48. [net,tr] = train(net,x_train,t_train);
  49. y_train = net(x_train);
  50.  
  51. % Plots vari
  52. figure, plotperform(tr) % Andamento errori
  53. figure, plotconfusion(t_train,y_train),title('Training Confusion Matrix')   % Matrice di confusione
  54. %figure, plotroc(t,y)   % ROC
  55.  
  56. %% Test Rete
  57. y_test = net(x_test);
  58. figure, plotconfusion(t_test,y_test),title('Test Confusion Matrix')   % Matrice di confusione

Traccia ed esempio svolto a lezione (1)

  • Utilizzando il dataset "cancer_dataset" già presente in Matlab, implementare un classificatore binario con un solo layer formato da 10 neuroni, ’traingdx’ come funzione di addestramento e ‘mse’ come funzione errore. Utilizzare il validation set come criterio di stop (numero massimo di fallimenti pari a 20) e 1000 epoche come numero massimo di iterazioni. Impostare, inoltre, ‘tansig’ e ‘logsig’ rispettivamente come funzioni di attivazione del primo layer nascosto e del layer di uscita.
    Si rappresenti la matrice di confusione sul test set.
  • Salvare le matrici dei pesi, inizializzare la rete e ripetere l’addestramento senza validation set.
    Rappresentare nuovamente la matrice di confusione sul test set.
  1. %% Caricamento del dataset
  2. load cancer_dataset.mat
  3.  
  4. x = cancerInputs;
  5. t = cancerTargets;
  6.  
  7. disp(['# Features: ',num2str(size(x,1))])
  8. disp(['# Samples: ',num2str(size(x,2))])
  9.  
  10. %% Split dataset
  11. rng(0)
  12. test_rate = .15;
  13. idx = randperm(size(x,2));
  14. test_n = floor(test_rate*size(x,2));
  15. test_idx = idx(1:test_n);
  16. non_test_idx = idx(test_n+1:end);
  17.  
  18. x_test = x(:,test_idx);
  19. t_test = t(:,test_idx);
  20.  
  21. x = x(:,non_test_idx);
  22. t = t(:,non_test_idx);
  23.  
  24. %% Creazione rete
  25.  
  26. % Layers nascosti
  27. hiddenLayerSize = [10];
  28.  
  29. % Training Function - help nntrain
  30. trainFcn = 'traingdx'; % traingda, traingdm, traingd
  31.  
  32. % Creazione rete
  33. net = patternnet(hiddenLayerSize, trainFcn);
  34.  
  35. % Suddivisione dataset
  36. net.divideFcn = 'dividerand';
  37. net.divideParam.trainRatio = .8;
  38. net.divideParam.valRatio = .2;
  39. net.divideParam.testRatio = 0;
  40.  
  41. % Criteri di stop
  42. net.trainParam.epochs = 1000;
  43. net.trainParam.max_fail = 20;
  44.  
  45. % Funzione errore
  46. net.performFcn = 'mse';
  47.  
  48. % Funzioni di attivazione
  49. net.layers{1}.transferFcn = 'tansig';
  50. net.layers{end}.transferFcn = 'logsig';
  51.  
  52. %% Inizializzazione Rete
  53. net = configure(net,x,t);
  54. net = init(net);
  55. view(net)
  56.  
  57. %% Addestramento Rete
  58. [net,tr] = train(net,x,t);
  59.  
  60. y = net(x);
  61. figure, plotperform(tr)
  62. figure, plotconfusion(t,y,'Training 1')   % Matrice di confusione
  63.  
  64. %% Test Rete
  65. y_test = net(x_test);
  66. figure, plotconfusion(t_test,y_test,'Test 1')   % Matrice di confusione
  67.  
  68. %% Senza validation (punto 2)
  69.  
  70. % Salvataggio matrici dei pesi
  71. LW = net.LW;
  72. IW = net.IW;
  73.  
  74. net.divideFcn = 'dividetrain';
  75. net = init(net);
  76. [net,tr] = train(net,x,t);
  77.  
  78. y = net(x);
  79. figure, plotperform(tr)
  80. figure, plotconfusion(t,y,'Training 2')   % Matrice di confusione
  81.  
  82. y_test = net(x_test);
  83. figure, plotconfusion(t_test,y_test,'Test 2')   % Matrice di confusione

Traccia ed esempio svolto a lezione (2)

Da una osservazione effettuata su pazienti afferenti ad una struttura ospedaliera si vuole dedurre il periodo di degenza.
Sono state effettuate le seguenti osservazioni:

  1. media degenza per un paziente anziano soggetto ad intervento, con complicanze e con patologie pregresse non rilevanti;
  2. media degenza per un paziente adulto soggetto ad intervento, con complicanze e con patologie pregresse;
  3. degenza giornaliera per un paziente adulto soggetto ad intervento, con complicanze e senza patologie pregresse;
  4. degenza giornaliera per paziente giovane soggetto ad intervento, con complicanze e con patologie pregresse non rilevanti;
  5. lunga degenza per un paziente anziano soggetto ad intervento, senza complicanze e con patologie pregresse non rilevanti;
  6. lunga degenza per un paziente adulto soggetto ad intervento, senza complicanze e con patologie pregresse;
  7. media degenza per un paziente adulto non soggetto ad intervento e con patologie pregresse;
  8. degenza giornaliera per un paziente giovane soggetto ad intervento, senza complicanze e senza patologie pregresse;
  9. lunga degenza per un paziente anziano non soggetto ad intervento e con patologie pregresse;
  10. media degenza per un paziente adulto soggetto ad intervento, senza complicanze e con patologie pregresse non note;
  11. media degenza per un paziente giovane soggetto ad intervento, senza complicanze e con patologie pregresse;
  12. media degenza per un paziente anziano non soggetto ad intervento e con patologie pregresse non note;
  13. degenza giornaliera per un paziente adulto non soggetto ad intervento e senza patologie pregresse;
  14. degenza giornaliera per un paziente giovane non soggetto ad intervento e con patologie pregresse non rilevanti

I dati in input sono:

  • presenza (P1=+1) o meno (P1=-1) di intervento chirurgico;
  • presenza di complicanze (P2=+1) o meno (P2=-1) dopo intervento chirurgico, in assenza di intervento P2=0;
  • presenza (P3=+1) o meno (P3=-1) di patologie pregresse, se non note o non rilevanti si porrà P3=0;
  • età P4 del paziente, con valori +1, 0, -1 rispettivamente con profilo "anziano", "adulto" o "giovane";

L'output T corrisponde al periodo di degenza, con valori +1, +0.5, 0 rispettivamente per "lunga", "media" o "giornaliera".

Tabella dei dati di input ed output realizzata secondo la codifica indicata:

Feature 1 Feature 2 Feature 3 Feature 4 Target
1 1 0 1 0.5
1 1 1 0 0.5
1 1 -1 0 0
1 1 0 -1 0
1 -1 0 1 1
1 -1 1 0 1
-1 0 1 0 0.5
1 -1 -1 -1 0
-1 0 1 1 1
1 -1 0 0 0.5
1 -1 1 -1 0.5
-1 0 0 1 0.5
-1 0 -1 0 0
-1 0 0 -1 0

Implementazione rete:

  1. %% Esempio di risoluzione del problema del sistema esperto
  2.  
  3. P =[ 1 1 1 1 1 1 -1 1 -1 1 1 -1; 
  4.      1 1 1 1 -1 -1 0 -1 0 -1 -1 0;
  5.      0 1 -1 0 0 1 1 -1 1 0 1 0;
  6.      1 0 0 -1 1 0 0 -1 1 0 -1 1];
  7. T = [ 0.5 0.5 0 0 1 1 0.5 0 1 0.5 0.5 0.5] ; 
  8.  
  9. %test generalizzazione
  10. P13=[ -1 0  -1 0]';
  11. T13 = 0;
  12. % a213 deve essere prossimo T13;
  13.  
  14. P14=[-1 0  0 -1]';
  15. T14 = 0;
  16. % a214 deve essere prossimo T14;
  17.  
  18. %test robustezza (immunità al rumore)
  19. Pnoise=[0.8 0.8 0.1 0.8]';
  20. Tnoise = .5;
  21. % essendo Pnoise prossimo a P(1) Tnoise 
  22. % deve essere prossimo T(1)
  23.  
  24. %% Creazione rete
  25.  
  26. % Layers nascosti
  27. hiddenLayerSize = [5];
  28.  
  29. % Training Function - help nntrain
  30. trainFcn = 'traingdx'; % traingda, traingdm, traingd
  31.  
  32. % Creazione rete
  33. net = patternnet(hiddenLayerSize, trainFcn);
  34.  
  35. % Suddivisione dataset
  36. net.divideFcn = 'dividetrain';
  37.  
  38. % Criteri di stop
  39. net.trainParam.epochs = 20000;
  40. net.trainParam.goal = 1e-4;
  41.  
  42. % Funzione errore
  43. net.performFcn = 'mse';
  44.  
  45. % Funzioni di attivazione
  46. net.layers{1}.transferFcn = 'logsig';
  47. net.layers{end}.transferFcn = 'logsig';
  48.  
  49. %% Inizializzazione Rete
  50. net = configure(net,P,T);
  51. rng(0)
  52. net = init(net);
  53. view(net)
  54.  
  55. %% Addestramento Rete
  56. [net,tr] = train(net,P,T);
  57. y = net(P)
  58.  
  59. %% Test Rete
  60. a = net(P);
  61. a13 = net(P13)
  62. a14 = net(P14)
  63. anoise = net(Pnoise)

Apprendimento Non Supervisionato

Cluster Analysis: Self-Organizing Maps

Implementazione rete SOM:

  1. load filteredyeastdata.mat
  2. rng(0);
  3. [x,std_settings] = mapstd(yeastvalues');  % Normalize data
  4. [x,pca_settings] = processpca(x,0.15);    % PCA
  5.  
  6. % Dimensione
  7. dimensions = [10];
  8.  
  9. % Creazione rete
  10. net = selforgmap(dimensions);
  11.  
  12. % Visualizza rete
  13. net = configure(net,x);
  14. view(net)
  15.  
  16. % Criteri di stop
  17. net.trainParam.epochs = 2000;
  18. % Stampa output nella command line
  19. net.trainParam.showCommandLine = 1;
  20.  
  21. % Addestramento Rete
  22. net = train(net,x);
  23.  
  24. % Plots vari
  25. figure,plotsompos(net,x);   % Pesi neuroni
  26. figure,plotsomhits(net,x);  % Numero di input che attivano ogni neurone
  27. figure,plotsomnd(net,x);    % Distanze neuroni
  28.  
  29. % Indice del cluster (neurone) dato un input
  30. y = net(x);
  31. cluster_indices = vec2ind(y);


Cluster Analysis: k-Means

Implementazione k-Means:

  1. clear all, close all
  2. rng(0); % For reproducibility
  3. load dataset3.mat
  4.  
  5. [X,pca_settings] = processpca(X',0.15);
  6. X = X';
  7.  
  8. %% K-means
  9. K = 3;
  10.  
  11. % Rappresento i dati
  12. figure;
  13. plot(X(:,1),X(:,2),'k*','MarkerSize',5);
  14. grid minor
  15. xlabel 'F1'; 
  16. ylabel 'F2';
  17.  
  18. [idx,C] = kmeans(X,K);
  19.  
  20. % Rappresento i dati secondo i cluster individuati dall'applicazione del k-means
  21. figure;
  22. gscatter(X(:,1),X(:,2),idx);
  23. hold on
  24. plot(C(:,1),C(:,2),'kx','MarkerSize',15,'LineWidth',3);
  25. hold off
  26. legend('Region 1','Region 2','Region 3','C');

Dendrogramma

Costruzione del dendrogramma partendo da dati generati casualmente:

  1. %% Generazione dei dati
  2. rng(0) % For reproducibility
  3. N = 10; % Samples
  4. X = rand(N,2); % Dataset
  5.  
  6. %% Rappresentazione del dataset
  7. figure,plot(X(:,1),X(:,2),'*')
  8. grid minor
  9. txt = strsplit(num2str(1:N));
  10. text(X(:,1),X(:,2),txt,'FontSize',15)
  11.  
  12. %% Costruzione del dendrogramma
  13. tree = linkage(X,'average','euclidean'); % Creazione albero
  14. figure,dendrogram(tree)

Test chi-quadro

Si supponga di lanciare una moneta 10 volte e di ottenere 6 volte testa e 4 volte croce. È possibile affermare che la distribuzione dei risultati sia coerente con quella di una moneta non truccata?

Applicazione del test chi-quadro:

  1. obs = [4;6]; % Vettore delle osservazioni
  2. expt = [5;5]; % Vettore dei valori attesi
  3. df = 1; % Gradi di liberà
  4.  
  5. c = compute_chi(obs,expt);
  6. p = chi_table(.05,df);
  7. disp(c > p)
  8.  
  9.  
  10. %% Funzioni
  11.  
  12. % Calcolo del chi-quadro
  13. function c = compute_chi(obs,expt)
  14. c = sum((obs - expt).^2 ./ expt);
  15. %c = sum((abs(obs - expt)-.5).^2 ./ expt);
  16. end
  17.  
  18. % Inversa del chi-quadro fissati "df" gradi di libertà e "1-p" probabilità
  19. function C = chi_table(p,df)
  20. C = chi2inv(1-p,df);
  21. end

t-Test

Date le seguenti misure si verifichi, applicando t-Test con un livelli di significatività del 5%, se è possibile affermare che la popolazione provenga da una distribuzione normale con media pari a 5 e varianza non nota.

5.53 6.83 2.74 5.86 5.31 3.69 4.56 5.34 8.57 7.76 3.65 8.03 5.72 4.93 5.71 4.79 4.87 6.48 6.40 6.41 5.67 3.79 5.71 6.63 5.48
  1. % Dati
  2. x = [5.53,6.83,2.74,5.86,5.31,3.69,4.56,5.34,8.57,7.76,3.65,8.03,5.72,4.93,5.71,4.79,4.87,6.48,6.40,6.41,5.67,3.79,5.71,6.63,5.48];
  3. disp(['Media dati: ',num2str(mean(x))])
  4.  
  5. %% t-Test
  6. [ht,pp] = ttest(x,m,'Alpha',.05)
  7.  
  8. if ht
  9.     disp('Rifiuto ipotesì nulla')
  10. end

z-Test

Date le seguenti misure si verifichi, applicando z-Test con un livelli di significatività del 5%, se è possibile affermare che la popolazione provenga da una distribuzione con media pari a 5 e deviazione standard pari a 1.

5.53 6.83 2.74 5.86 5.31 3.69 4.56 5.34 8.57 7.76 3.65 8.03 5.72 4.93 5.71 4.79 4.87 6.48 6.40 6.41 5.67 3.79 5.71 6.63 5.48
  1. % Dati
  2. x = [5.53,6.83,2.74,5.86,5.31,3.69,4.56,5.34,8.57,7.76,3.65,8.03,5.72,4.93,5.71,4.79,4.87,6.48,6.40,6.41,5.67,3.79,5.71,6.63,5.48];
  3. disp(['Media dati: ',num2str(mean(x))])
  4.  
  5. %% z-Test
  6. sigma = 1;
  7. [hz,pz] = ztest(x,m,sigma,'Alpha',.05)
  8.  
  9. if hz
  10.     disp('Rifiuto ipotesì nulla')
  11. end


Esame 4 luglio 2019

Traccia:

Si supponga di aver addestrato una rete neurale feedforward e di voler testare le performance su un nuovo dataset. La rete è stata addestrata usando la seguente configurazione:

  • un layer nascosto formato da 10 neuroni e avente come funzione di trasferimento "tansig";
  • un layer di uscita formato da un solo neurone e avente come funzione di trasferimento "logsig”.

Successivamente all’addestramento, lo stato della rete è stato salvato all’interno di tre strutture dati Matlab IW, LW, b contenenti rispettivamente: i pesi in ingresso, i pesi del layer nascosto e i vettori di bias. Fissando, quindi, una soglia sull’output di classificazione pari a 0.5, si valutino le performance in termini di accuratezza sul nuovo dataset fornito. Si rappresentino successivamente le curve ROC relativamente ai valori di soglia: 0.1, 0.5 e 0.8. Si commentino i risultati ottenuti.

N.B.: Tutte le variabili necessarie allo svolgimento sono contenute all’interno del file esame.mat fornito.

Possibile soluzione per il ripristino di una rete:

  1. clear all, close all
  2. load esame.mat;
  3.  
  4. % Creazione rete
  5. net = patternnet([10]);
  6. net = configure(net,features,target);
  7.  
  8. % Funzioni di attivazione
  9. net.layers{1}.transferFcn = 'tansig';
  10. net.layers{end}.transferFcn = 'logsig';
  11.  
  12. % Pesi
  13. net.IW = IW;
  14. net.LW = LW;
  15. net.b = b;
  16.  
  17. % Test
  18. y_test = net(features);

Per la valutazione delle performance e delle curve ROC si rimanda al seguente link