R/h_clust.R

Defines functions h_clust

Documented in h_clust

h_clust <- function(X, K, method){
  MatDistance_X <- as.matrix(dist(X)) # Matrice distance de X basée sur la distance euclidienne
  MatDistance_X[MatDistance_X==0] <- NA #transformer tous les 0 en NA, on aura donc aucune distance nulle
  Clust <- list()# Clust est une liste qui contiendra les cluster formés
  
  #initialisation des clusters, chaque individu sera un cluster
  for (clu in 1:nrow(X)) {Clust[[clu]] <- clu}
  
  #Le vecteur statut est un indicateur de regroupage , 1 si le cluster n'est pas encore regroupé, 0 sinon.
  status <- c(rep(1,nrow(X)))# Au début, aucun clusters n'a été regroupés, donc statut contiendra que des 1.
  
  MatDistCluster <- matrix(NA,2*nrow(X)-K,2*nrow(X)-K)
  
  MatDistCluster[1:nrow(MatDistance_X),1:ncol(MatDistance_X)] <- MatDistance_X
  CluDistMatFinal <- MatDistCluster
  
  for (item in 1:(nrow(X)-K)) {
    # Recherche des individus ayant la plus petite distance 
    minClu <- which(CluDistMatFinal==min(CluDistMatFinal, na.rm=TRUE), arr.ind=T)# Recherche des indices du minimum des distances
    #création d'un cluster contenant les clusters formés à cette étape.
    Clust[[nrow(X)+item]] <- c(Clust[[minClu[nrow(minClu),1]]],Clust[[minClu[nrow(minClu),2]]])  
    
    #Affectation de 0 dans le vecteur statut des indices des clusters formés
    status[minClu[nrow(minClu),]] <- 0
    #Affectation de 1 au nouveau cluster
    status[nrow(X)+item] <- 1
    
    
    # On doit recalculer les distances entre le nouveau cluster et les autres,
    #Le calcul se fera avec la fonction dist. Cela dans le but de créer un nouveau cluster qui sera constitué des 2 clusters les plus proches.
    
    # Mise à jour de la matrice de distance
    MatDistCluster <- distc(X, MatDistCluster, Clust, method)
    # A cette étape, MatDistCluster contient la matrice de distance initiale et les nouvelles distances entre les anciens clusters et le  nouveau cluster.
    # Il nous faut maintenant supprimer de la matrice CluDistMatFinal, les clusters deja regroupé.
    
    # Mise à jour de CluDistMatFinal
    CluDistMatFinal[minClu[nrow(minClu),],] <- NA
    CluDistMatFinal[,minClu[nrow(minClu),]] <- NA
    
    # Il faut ajouter à CluDistMatFinal les nouvelles distances calculées 
    
    CluDistMatFinal[(nrow(X)+item),1:(nrow(X)+item)] <- MatDistCluster[(nrow(X)+item),1:(nrow(X)+item)]# cas de la matrice triangulaire inferieur
    
    CluDistMatFinal[1:(nrow(X)+item),(nrow(X)+item)] <- MatDistCluster[1:(nrow(X)+item),(nrow(X)+item)]# cas de la matrice triangulaire supérieur
    
  }
  finClu <- Clust[status==1] # status==1 représente les individus qui n'ont pas encore été regroupés
  finClu1 <- c()
  for (item in 1:length(finClu))finClu1[finClu[[item]]] <- item
  
  cat('Les labels des clusters finaux:\n',finClu1,'\n')
  
  return(list(finClu1, finClu))
}
yechchi/Algorithmique documentation built on Jan. 20, 2021, 12:30 a.m.