Home > Codi > Plot_Confusion_Matrix.m

Plot_Confusion_Matrix

PURPOSE ^

Funció per dibuixar grŕficament les matrius de confusió que crea la funció

SYNOPSIS ^

function Plot_Confusion_Matrix(classp,classreal,maxclasses,te,M)

DESCRIPTION ^

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)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

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

Generated on Wed 12-Sep-2012 13:03:54 by m2html © 2005