Laboratorio Matlab

Da Bioingegneria Elettronica e Informatica.

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

  • 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


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 = [clusters_number];
  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);

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