Laboratorio Matlab: differenze tra le versioni
Da Bioingegneria Elettronica e Informatica.
(→Cluster Analysis: Self-Organizing Maps) |
|||
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 89: | Riga 90: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | === Traccia ed esempio svolto a lezione === | ||
+ | |||
+ | * 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, plotconfusion(t,y,'Training 1') % Matrice di confusione | ||
+ | |||
+ | %% Test Rete | ||
+ | y_test = net(x_test); | ||
+ | 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> | ||
+ | |||
+ | |||
+ | == Apprendimento Non Supervisionato == | ||
=== Cluster Analysis: Self-Organizing Maps === | === Cluster Analysis: Self-Organizing Maps === | ||
Implementazione rete SOM: | Implementazione rete SOM: | ||
Riga 125: | Riga 220: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | == Dendrogramma == | |
Costruzione del dendrogramma partendo da dati generati casualmente: | Costruzione del dendrogramma partendo da dati generati casualmente: | ||
Riga 145: | Riga 240: | ||
</syntaxhighlight> | </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? | 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? | ||
Versione delle 10:57, 5 giu 2019
Indice
Apprendimento Supervisionato
Reti Neurali Feed-Forward
Esempio di applicazione di reti neurali artificiali.
Creazione dataset:
load cancer_dataset.mat
x = cancerInputs;
t = cancerTargets(1,:);
temp = [x;t];
rng(0)
p = randperm(size(temp,2)); % Genero un vettore di permutazioni casuali
train_size = floor(size(temp,2)*.8); % Percentuale di dati per il primo subset
p_train = p(1:train_size); % Seleziono la percentuale di indici per il primo subset
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);
t_train = temp(10,p_train);
x_test = temp(1:9,p_test);
t_test = temp(10,p_test);
% Salvataggio del dataset
save('dataset2.mat','x_train','t_train','x_test','t_test')
Implementazione rete neurale:
load dataset2.mat
disp(['# Features: ',num2str(size(x_train,1))])
disp(['# Samples: ',num2str(size(x_train,2))])
%% Creazione rete
% Layers nascosti
% hiddenLayerSize = [20];
% hiddenLayerSize = [50];
hiddenLayerSize = [20,10];
% Training Function - help nntrain
trainFcn = 'traingdx'; % traingda, traingdm, traingd
% Creazione rete
net = patternnet(hiddenLayerSize, trainFcn);
% Suddivisione dataset
net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 30/100;
net.divideParam.testRatio = 0/100;
% Criteri di stop
net.trainParam.epochs = 5000;;
%net.trainParam.max_fail = 20;
%net.trainParam.min_grad = 0;%10e-5;
% Funzione errore
net.performFcn = 'mse';
% Funzioni di attivazione
net.layers{end}.transferFcn = 'logsig';
% Visualizza rete
view(net)
%% Inizializzazione Rete
rng(0)
net = configure(net,x_train,t_train);
net = init(net);
init_LW = net.LW;
init_IW = net.IW;
%% Addestramento Rete
[net,tr] = train(net,x_train,t_train);
y_train = net(x_train);
% 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
Traccia ed esempio svolto a lezione
- 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.
%% 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, plotconfusion(t,y,'Training 1') % Matrice di confusione
%% Test Rete
y_test = net(x_test);
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
Apprendimento Non Supervisionato
Cluster Analysis: Self-Organizing Maps
Implementazione rete SOM:
load filteredyeastdata.mat
rng(0);
[x,std_settings] = mapstd(yeastvalues'); % Normalize data
[x,pca_settings] = processpca(x,0.15); % PCA
% Dimensione
dimensions = [clusters_number];
% Creazione rete
net = selforgmap(dimensions);
% Visualizza rete
net = configure(net,x);
view(net)
% Criteri di stop
net.trainParam.epochs = 2000;
% Stampa output nella command line
net.trainParam.showCommandLine = 1;
% Addestramento Rete
net = train(net,x);
% Plots vari
figure,plotsompos(net,x); % Pesi neuroni
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);
cluster_indices = vec2ind(y);
Dendrogramma
Costruzione del dendrogramma partendo da dati generati casualmente:
%% 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)
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:
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