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.