 knn_fusion <- function (matr_appr,matr_test,kn) list(matr_conf,vect_prob_classif,vect_prob_erreur,matr_sort_classif)
{
# clustering K-NN

# matr_appr         - matrice des vecteurs d'apprentissage
# matr_test         - matrice des vecteurs de test
# matr_conf         - matrice de confusion
# vect_prob_classif - vecteur contenant la probabilité de bonne classification pour chaque classe
# vect_prob_erreur  - vecteur contenant la probabilité moyenne d'erreur pour chaque classe
# kn                - nombre des plus proches voisins
#
  
  [nbre_comp,nbre_vect_test]=nrow(matr_test);
  vect_etiquettes_appr=matr_appr(nbre_comp,:);
  nbre_classes=max(vect_etiquettes_appr);
  nbre_vect_appr=size(matr_appr,2);
  matr_appr=(matr_appr(1:nbre_comp-1,:)).';
  
  vect_etiquettes_test=matr_test(nbre_comp,:);
  matr_test=(matr_test(1:nbre_comp-1,:));
  
  restest=zeros(2,nbre_vect_test);
  restest(1,:)=vect_etiquettes_test;
  
  matr_sort_classif=zeros(nbre_classes,nbre_vect_test);
  
  if (nbre_vect_test==1)&(nbre_vect_appr==1)
  matr_conf=[];
  if vect_etiquettes_test==vect_etiquettes_appr
  vect_prob_classif=1;
  vect_prob_erreur=0;
  else
  vect_prob_classif=0;
  vect_prob_erreur=1;
  end
  elseif nbre_vect_appr==1
  matr_conf=[];
  vect_prob_classif=length(find(vect_etiquettes_test==vect_etiquettes_appr))/nbre_vect_test;
  vect_prob_erreur=1-vect_prob_classif;
  elseif nbre_vect_test==1
  matr_conf=[];
  vect_dist=dist(matr_appr,matr_test);
  [vect_dists,vect_idxs]=sort(vect_dist);
  vect_etiquettes=vect_etiquettes_appr(vect_idxs)';
  vect_etiquettes=vect_etiquettes(1:kn,:);
  vect_hist_etiquettes=histc(vect_etiquettes,[.5:1:nbre_classes+.5]);
  [valmax,idxmax]=max(vect_hist_etiquettes);
  if vect_etiquettes_test==idxmax
  vect_prob_classif=1;
  vect_prob_erreur=0;
  else
    vect_prob_classif=0;
  vect_prob_erreur=1;
  end
  else
    matr_dist=dist(matr_appr,matr_test);
  [matr_dists,matr_idxs]=sort(matr_dist);
  
  mc=2;    
  matr_dist_inv=matr_dists.^(-2/mc);
  matr_etiquettes=vect_etiquettes_appr(matr_idxs);
  %     if size(matr_idxs,2)==1
  %         matr_etiquettes=matr_etiquettes';
%     end
    matr_etiquettes=matr_etiquettes(1:kn,:);
    
    if kn==1
        restest(2,:)=matr_etiquettes(1,:);
    else
        matr_hist_etiquettes=histc(matr_etiquettes,[.5:1:nbre_classes+.5]);
        [valmax,idxmax]=max(matr_hist_etiquettes);
        restest(2,:)=idxmax;
    end
    
matr_idxs_red=matr_idxs(1:kn,:);
matr_dist_inv_red=matr_dist_inv(1:kn,:);


vect_denom=sum(matr_dist_inv_red);
matr_sort_classif=zeros(nbre_classes,nbre_vect_test);
matr_etiquettes_red=matr_hist_etiquettes(1:end-1,:);
for k1=1:nbre_vect_test
    denom=vect_denom(k1);
    for k2=1:nbre_classes
        ind=find(matr_etiquettes(:,k1)==k2);
        if isempty(ind)
            numer=0;
        else
            numer=sum(matr_dist_inv_red(ind,k1));
        end
        matr_sort_classif(k2,k1)=numer/denom;
    end
end
    [matr_conf,vect_prob_classif,vect_prob_erreur]=param_perf(restest);
end

}