Laboratorio Matlab: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
(Materiale per Bioinformatica Avanzata in attesa di pagina specifica)
(Materiale per il Corso di Bioinformatica Avanzata in attesa di pagina specifica)
 
(Una versione intermedia di uno stesso utente non sono mostrate )
Riga 620: Riga 620:
  
 
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]
 
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]
 
 
== Materiale per Bioinformatica Avanzata in attesa di pagina specifica ==
 
 
Tecniche di Ottimizzazione e Algoritmi Genetici
 
https://it.wikipedia.org/wiki/Algoritmo_genetico
 
https://it.mathworks.com/discovery/genetic-algorithm.html
 

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