Implémenter une technique de clustering de données avancé, Excel VBA

Implémenter une technique de clustering de données avancé, Excel VBA

Voici une explication détaillée pour implémenter une technique de clustering de données avancé dans Excel avec VBA, notamment l’algorithme K-means. Je vais expliquer chaque étape et détailler le code pour que vous puissiez facilement le comprendre et l’adapter à vos besoins.
Étape 1 : Préparation des données
Avant de commencer à écrire le code VBA pour K-means, il est important de préparer vos données dans Excel. Prenons l’exemple d’un jeu de données avec deux caractéristiques (2D).
1. Structure des données :

  • Colonne A : Caractéristique 1
  • Colonne B : Caractéristique 2

Vous souhaitez appliquer l’algorithme de clustering sur ces caractéristiques.
2. Nombre de clusters (k) : Vous devrez définir le nombre de clusters (k). Cela peut être une valeur fixe que vous saisissez manuellement, ou vous pouvez automatiser le processus de sélection, mais pour simplifier l’exemple, nous allons supposer que k est fixe.
Étape 2 : L’algorithme K-means
Voici l’idée de base derrière l’algorithme K-means :
1. Initialisation des centroids : Sélectionnez aléatoirement k points de données comme centroids initiaux.
2. Assigner les points aux clusters : Pour chaque point de données, calculez la distance par rapport à chaque centroid et assignez le point au centroid le plus proche.
3. Recalculer les centroids : Après avoir attribué tous les points aux clusters, recalculez les centroids comme la moyenne des points dans chaque cluster.
4. Répéter : Répétez les étapes d’assignation et de recalcul des centroids jusqu’à convergence, c’est-à-dire lorsque les centroids ne changent plus.
Étape 3 : Écriture du code VBA
Maintenant, passons à l’écriture du code.
1. Appuyez sur Alt + F11 pour ouvrir l’éditeur VBA.
2. Insérez un nouveau module : Allez dans Insertion > Module dans l’éditeur VBA.
Voici le code pour implémenter l’algorithme K-means en VBA :

Sub KMeansClustering()
    Dim ws As Worksheet
    Dim dataRange As Range
    Dim k As Integer
    Dim maxIterations As Integer
    Dim points() As Variant
    Dim centroids() As Variant
    Dim assignments() As Integer
    Dim newCentroids() As Variant
    Dim i As Integer, j As Integer, iteration As Integer
    Dim minDist As Double, dist As Double
    Dim closestCentroid As Integer
    Dim sumX As Double, sumY As Double
    Dim count As Integer
    ' Définir les paramètres
    Set ws = ThisWorkbook.Sheets("Sheet1") ' Nom de votre feuille de calcul
    Set dataRange = ws.Range("A2:B100") ' Plage de données à ajuster
    k = 3 ' Nombre de clusters (ajustez ce chiffre)
    maxIterations = 100 ' Nombre maximal d'itérations pour éviter les boucles infinies
    ' Charger les données dans un tableau
    points = dataRange.Value
    ' Initialiser les centroids (sélectionner aléatoirement k points)
    ReDim centroids(1 To k, 1 To 2) ' Supposons des données en 2D (x, y)
    Randomize
    For i = 1 To k
        centroids(i, 1) = points(Int((UBound(points, 1) - 1 + 1) * Rnd + 1), 1)
        centroids(i, 2) = points(Int((UBound(points, 1) - 1 + 1) * Rnd + 1), 2)
    Next i
    ' Initialiser le tableau des assignments
    ReDim assignments(1 To UBound(points, 1))
    ' Boucle principale de K-means
    For iteration = 1 To maxIterations
        ' Étape 1 : Assigner les points au centroid le plus proche
        For i = 1 To UBound(points, 1)
            minDist = 1E+30 ' Initialisation d'une grande valeur
            closestCentroid = -1
            For j = 1 To k
                dist = (points(i, 1) - centroids(j, 1)) ^ 2 + (points(i, 2) - centroids(j, 2)) ^ 2
                If dist < minDist Then minDist = dist closestCentroid = j End If Next j assignments(i) = closestCentroid Next i ' Étape 2 : Recalculer les centroids ReDim newCentroids(1 To k, 1 To 2) For i = 1 To k sumX = 0 sumY = 0 count = 0 For j = 1 To UBound(points, 1) If assignments(j) = i Then sumX = sumX + points(j, 1) sumY = sumY + points(j, 2) count = count + 1 End If Next j If count > 0 Then
                newCentroids(i, 1) = sumX / count
                newCentroids(i, 2) = sumY / count
            Else
                ' Si aucun point n'est assigné à un centroid, réinitialiser aléatoirement
                newCentroids(i, 1) = points(Int((UBound(points, 1) - 1 + 1) * Rnd + 1), 1)
                newCentroids(i, 2) = points(Int((UBound(points, 1) - 1 + 1) * Rnd + 1), 2)
            End If
        Next i
        ' Vérifier la convergence (si les centroids n'ont pas changé, sortir de la boucle)
        If Not CentroidsChanged(centroids, newCentroids) Then
            Exit For
        End If
        ' Mettre à jour les centroids
        centroids = newCentroids
    Next iteration
    ' Étape 3 : Afficher les résultats
    ' Écrire les assignments dans la feuille
    For i = 1 To UBound(assignments, 1)
        ws.Cells(i + 1, 3).Value = assignments(i) ' Assignation des clusters dans la colonne C
    Next i
    ' Afficher les centroids (si nécessaire)
    For i = 1 To k
        ws.Cells(i + 1, 5).Value = "Centroid " & i
        ws.Cells(i + 1, 6).Value = centroids(i, 1)
        ws.Cells(i + 1, 7).Value = centroids(i, 2)
    Next i
    MsgBox "Le clustering K-means est terminé !", vbInformation
End Sub
Function CentroidsChanged(ByRef oldCentroids As Variant, ByRef newCentroids As Variant) As Boolean
    Dim i As Integer
    For i = 1 To UBound(oldCentroids, 1)
        If oldCentroids(i, 1) <> newCentroids(i, 1) Or oldCentroids(i, 2) <> newCentroids(i, 2) Then
            CentroidsChanged = True
            Exit Function
        End If
    Next i
    CentroidsChanged = False
End Function

Étape 4 : Explication du code
Voici le détail du fonctionnement du code :
1. Définition des paramètres :

  • Le code commence par définir le nom de la feuille de calcul, la plage de données (ici A2:B100), le nombre de clusters (k), et le nombre d’itérations maximales.

2. Chargement des données :

  • Les données de la plage sélectionnée sont chargées dans un tableau points pour un traitement plus rapide.

3. Initialisation des centroids :

  • Les centroids sont initialisés en sélectionnant aléatoirement k points de données dans l’ensemble de données.

4. Boucle principale :

  • Assigner les points aux clusters : Pour chaque point, on calcule la distance à chaque centroid et on assigne le point au centroid le plus proche.
  • Recalculer les centroids : On met à jour les centroids en prenant la moyenne des points assignés à chaque cluster.
  • Vérifier la convergence : Si les centroids ne changent pas entre deux itérations, on arrête la boucle.

5. Affichage des résultats :

  • Les résultats (assignations des clusters) sont écrits dans la colonne C de la feuille Excel.
  • Les coordonnées des centroids finaux sont affichées dans les colonnes E, F et G.

6. Fonction de convergence :

  • La fonction CentroidsChanged compare les anciens centroids avec les nouveaux. Si ils sont identiques, la fonction retourne False, ce qui permet de sortir de la boucle.

Étape 5 : Exécution du code

  • Une fois le code écrit, retournez à Excel et appuyez sur Alt + F8 pour exécuter la macro KMeansClustering.
  • L’algorithme va effectuer le clustering et afficher les résultats dans la feuille Excel.

Conclusion
Ce code VBA montre comment implémenter l’algorithme de K-means pour le clustering de données dans Excel. Vous pouvez adapter ce code à des jeux de données plus complexes, augmenter le nombre de caractéristiques (colonnes) ou même implémenter d’autres techniques de clustering, mais cela nécessiterait un code un peu plus complexe.

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x