Funció per dibuixar grŕficament les matrius de confusió que crea la funció compute_extended_confusion_matrix, necessitarem a més a més l'objecte dades on tenim guardats els lots corresponents per poder mostrar els popupmenus. Parametres d'entrada Classp - La classe predita, ha de ser un cell, dins el cell hi ha d'haver tants lists com matrius es bulguin representar Exemple: {[1 1 1]} Per representar una matriu {[1 1 1] [1 2 1] [1 2 3]} per representar 3 matrius Classreal - La classe real, ha de ser un cell dins el cell hi ha d'haver tants lists com matrius es bulguin representar Exemple: {[1 1 1]} Per representar una matriu {[1 1 1] [1 2 1] [1 2 3]} per representar 3 matrius maxclasses - numero maxim de classes te - (opcional) Objecte DATA amb els objectes de la classe de test, ha de ser una llista contenin 1 o tants objectes data com matrius es bulguin representar M - (opcional) Si es te el resultat de cridar compute_extended_confusion_matrix es pot evitar fe la crida de nou i tenir major eficiencia. Sortida No te parametres de sortida, realitza la visualització de les matrius de confusió en plots, en cas d'indicar, te es mostrara la correspondencia de lots en clicar al nombre, en cas d'indicar més d'una matriu es mostrara la matriu global. Exemples on a és un objecte dades Plot_Confusion_Matrix({a.getClass},{a.getClass},max(a.getClass), [a]); Plot_Confusion_Matrix({a.getClass a.getClass},{a.getClass a.getClass},max(a.getClass), [a a]) Plot_Confusion_Matrix({[1 2 1]},{[1 1 1]},3)
0001 function Plot_Confusion_Matrix(classp,classreal,maxclasses,te,M) 0002 %Funció per dibuixar grŕficament les matrius de confusió que crea la funció 0003 %compute_extended_confusion_matrix, necessitarem a més a més l'objecte 0004 %dades on tenim guardats els lots corresponents per poder mostrar els 0005 %popupmenus. 0006 % 0007 %Parametres d'entrada 0008 % 0009 % Classp - La classe predita, ha de ser un cell, dins el cell hi ha 0010 % d'haver tants lists com matrius es bulguin representar 0011 % 0012 % Exemple: 0013 % 0014 % {[1 1 1]} Per representar una matriu 0015 % {[1 1 1] [1 2 1] [1 2 3]} per representar 3 matrius 0016 % 0017 % 0018 % Classreal - La classe real, ha de ser un cell dins el cell hi ha 0019 % d'haver tants lists com matrius es bulguin representar 0020 % 0021 % Exemple: 0022 % 0023 % {[1 1 1]} Per representar una matriu 0024 % {[1 1 1] [1 2 1] [1 2 3]} per representar 3 matrius 0025 % 0026 % 0027 % maxclasses - numero maxim de classes 0028 % 0029 % te - (opcional) Objecte DATA amb els objectes de la classe de test, 0030 % ha de ser una llista contenin 1 o tants objectes data com 0031 % matrius es bulguin representar 0032 % 0033 % M - (opcional) Si es te el resultat de cridar 0034 % compute_extended_confusion_matrix es pot evitar fe la crida de 0035 % nou i tenir major eficiencia. 0036 % 0037 % Sortida 0038 % 0039 % No te parametres de sortida, realitza la visualització de les matrius de 0040 % confusió en plots, en cas d'indicar, te es mostrara la correspondencia de 0041 % lots en clicar al nombre, en cas d'indicar més d'una matriu es mostrara 0042 % la matriu global. 0043 % 0044 % 0045 %Exemples 0046 % on a és un objecte dades 0047 % 0048 % Plot_Confusion_Matrix({a.getClass},{a.getClass},max(a.getClass), [a]); 0049 % 0050 % Plot_Confusion_Matrix({a.getClass a.getClass},{a.getClass a.getClass},max(a.getClass), [a a]) 0051 % 0052 % Plot_Confusion_Matrix({[1 2 1]},{[1 1 1]},3) 0053 0054 for i=1:length(classp) 0055 %Calculem la Matriu de confució 0056 if nargin < 5 0057 M{i}=compute_extended_confusion_matrix(classp{i},classreal{i},maxclasses); 0058 end 0059 %La passem a 'a' per posar-la be 0060 a=M{i}; 0061 a=a(length(a):-1:1,:); 0062 0063 %fem una figura i en recuperem el datacursormode per poder editar 0064 %els datatips. 0065 if(length(M) ==1) 0066 %ens criden externament 0067 0068 dcm_obj = datacursormode(gcf); 0069 0070 hold on 0071 imagesc((ones([size(a) 3]))); 0072 0073 %posem el titol 0074 %title('Confusion Matrix', 'FontSize',20) 0075 0076 %treiem els noms dels eixos perque ja els posarem manualment 0077 axis off 0078 0079 else 0080 %ens crida el Cross-validation 0081 0082 dcm_obj = datacursormode(figure); 0083 hold on 0084 imagesc((ones([size(a) 3]))); 0085 0086 %posem el titol 0087 title(['Confusion Matrix / Division ' num2str(i)],'FontSize',20) 0088 0089 %treiem els noms dels eixos perque ja els posarem manualment 0090 axis off 0091 end 0092 0093 0094 if nargin >= 4%si ens passen dades posarem datatip 0095 %asignem el nom de le funció que es cridara amb el datatip 0096 set(dcm_obj,'UpdateFcn',@myfunction) 0097 end 0098 0099 %posem els noms del eixos 0100 text(0.2,size(M{i},1)/2,' Real Class','Rotation',90,'FontSize',15); 0101 text(size(M{i},1)/2,0.2,' Predicted Class','FontSize',15); 0102 0103 for ii=1: size(M{i},1) 0104 %Posem els noms del eixos i dibuixem les linies 0105 text(0.3,size(M{i},1)-ii+1,num2str(ii));%text eix Y 0106 text(ii,0.3,num2str(ii));%text eix X 0107 line([ii+0.5 ; ii+0.5],[length(a)+0.5 ; 0.5],'color', 'K' ); 0108 line([length(a)+0.5 ; 0.5],[ii+0.5 ; ii+0.5],'color', 'K' ); 0109 0110 for j=1: size(M{i},1) 0111 %posem el numero vermell a la posicio que toca 0112 text(ii,j,num2str(a(j,ii)),'Color','r','fontSize',30); 0113 0114 if nargin >= 4 0115 %Per si ens passen un objecte DATA posem els lots al 0116 %datatip 0117 0118 %generem els datatip 0119 if a(j,ii) == 0 0120 %si no hi ha lots que fallen posem empty 0121 numl(j,ii) = {'empty'}; 0122 acu{j,ii,i} = 'empty'; 0123 0124 0125 if isempty(te(i).getBatchLabel) 0126 refl(j,ii) = {'not defined!'}; 0127 else 0128 refl(j,ii) = {'empty'}; 0129 end 0130 0131 0132 else 0133 %hi ha lots, hem de recuperar els noms i les posicions per 0134 %passar-los al datatip 0135 % index=(classp{i} == ii).*(te(i).getClass == (maxclasses-j+1));% modificació no necessari utilitzar l'acces a l'objecte ho tenim a classrereal 0136 index=(classp{i} == ii).*(classreal{i} == (maxclasses-j+1)); 0137 0138 aux=1:te(i).getBatchCount(); 0139 0140 numl(j,ii) = {num2str(aux(index==1))}; 0141 0142 if isempty(te(i).getBatchLabel) 0143 refl(j,ii) = {'not defined!'}; 0144 else 0145 refl(j,ii) = {cell2str(strcat(te(i).getBatchLabel(index==1),{' '}))}; 0146 acu{j,ii,i} = cell2str(strcat(te(i).getBatchLabel(index==1) , {' '})); 0147 end 0148 end 0149 end 0150 end 0151 0152 end 0153 0154 %posem les linies dels eixos 0155 line([0.5 ; 0.5],[length(a)+0.5 ; 0.5],'color', 'K' ); 0156 line([length(a)+0.5 ; 0.5],[0.5 ; 0.5],'color', 'K' ); 0157 0158 if nargin >= 4 %si ens passen dades posem un datatip 0159 %Asignem els datatips 0160 set(get(dcm_obj,'figure'),'userdata',{ a' numl' refl'}); 0161 end 0162 0163 hold off 0164 end 0165 0166 if length(M) > 1%nomes dibuixem la acumulada si hi ha mes d'una partició 0167 %fem el grafic Global 0168 dcm_obj = datacursormode(figure); 0169 %calculem la matriu acumulada 0170 a=M{1}; 0171 for i=2:length(M) 0172 a=a+M{i}; 0173 end 0174 0175 %posem be els numeros 0176 a=a(length(a):-1:1,:); 0177 0178 %Començem a dibuixar 0179 hold on 0180 imagesc((ones([size(a) 3]))); 0181 0182 %posem el titol 0183 title('Total Confusion Matrix','FontSize',20) 0184 %treiem els numeros dels eixos 0185 axis off 0186 %posem els noms de els eixos 0187 text(0.2,size(M{i},1)/2,' Real Class','Rotation',90,'FontSize',15); 0188 text(size(M{i},1)/2,0.2,' Predicted Class','FontSize',15); 0189 %pintem la matriu 0190 for ii=1: size(a,1) 0191 %test als eixos 0192 text(0.3,size(a,1)-ii+1,num2str(ii)); 0193 text(ii,0.3,num2str(ii)); 0194 %linies de separació 0195 line([ii+0.5 ; ii+0.5],[length(a)+0.5 ; 0.5],'color', 'K' ); 0196 line([length(a)+0.5 ; 0.5],[ii+0.5 ; ii+0.5],'color', 'K' ); 0197 for j=1: size(a,1) 0198 %numero en vermell 0199 text(ii,j,num2str(a(j,ii)),'Color','r','fontSize',30); 0200 end 0201 end 0202 %linia de separació 0203 line([0.5 ; 0.5],[length(a)+0.5 ; 0.5],'color', 'K' ); 0204 line([length(a)+0.5 ; 0.5],[0.5 ; 0.5],'color', 'K' ); 0205 0206 if nargin >= 4 %si ens passen l'objecte dades posem datatip 0207 %Posem el datatip 0208 set(dcm_obj,'UpdateFcn',@myfunction) 0209 set(get(dcm_obj,'figure'),'userdata',{ a' [] acu}); 0210 end 0211 0212 hold off 0213 end 0214 end 0215 0216 function output_txt = myfunction(~,event_obj) 0217 %funció que s'encarrega d'escriure el datatip utilitzant les dades 0218 %guardades a event_obj 0219 try 0220 dad=get(get(0,'CurrentFigure'),'userdata'); 0221 p=get(event_obj,'position'); 0222 if isempty(dad{2}) 0223 output_txt = {['Total batch number: ' num2str(dad{1}(p(1),p(2)))] '' 'batch reference:' dad{3}{p(2),p(1),:} }; 0224 0225 else 0226 output_txt = {['Total batch number: ' num2str(dad{1}(p(1),p(2)))] '' 'batch number:' dad{2}{p(1),p(2)} '' 'batch reference:' dad{3}{p(1),p(2)} }; 0227 end 0228 catch 0229 output_txt ={''}; 0230 end 0231 end