Laboratorio Matlab: differenze tra le versioni
(→Materiale per il Corso di Bioinformatica Avanzata in attesa di pagina specifica) |
|||
(23 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. | ||
− | Creazione dataset | + | Creazione dataset: |
<syntaxhighlight lang="matlab" line> | <syntaxhighlight lang="matlab" line> | ||
− | |||
− | |||
load cancer_dataset.mat | load cancer_dataset.mat | ||
x = cancerInputs; | x = cancerInputs; | ||
Riga 12: | 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 24: | 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 | + | Implementazione rete neurale: |
<syntaxhighlight lang="matlab" line> | <syntaxhighlight lang="matlab" line> | ||
− | |||
− | |||
load dataset2.mat | load dataset2.mat | ||
Riga 82: | 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, plotconfusion(t,y,'Training 1') % Matrice di confusione | |
− | + | ||
− | figure, plotconfusion( | + | |
− | % | + | |
%% Test Rete | %% Test Rete | ||
y_test = net(x_test); | y_test = net(x_test); | ||
− | figure, plotconfusion(t_test,y_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> | </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 === | ||
+ | Implementazione rete SOM: | ||
+ | <syntaxhighlight lang="matlab" line> | ||
+ | load filteredyeastdata.mat | ||
+ | rng(0); | ||
+ | [x,std_settings] = mapstd(yeastvalues'); % Normalize data | ||
+ | [x,pca_settings] = processpca(x,0.15); % PCA | ||
+ | |||
+ | % Dimensione | ||
+ | dimensions = [10]; | ||
+ | |||
+ | % 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); | ||
+ | </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
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 (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.
%% 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
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:
- 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:
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:
%% 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)
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 = [10];
% 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);
Cluster Analysis: k-Means
Implementazione k-Means:
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');
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
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 |
---|
% 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
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 |
---|
% 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
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:
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);
Per la valutazione delle performance e delle curve ROC si rimanda al seguente link