J'ai une instance de graphique avec des bords dirigés pondérés dont les valeurs peuvent être dans la plage [-1,1]. J'ai besoin de faire un clustering sur ce graphique, afin de trouver des groupes dans lesquels les sommets sont plus corrélés.
J'ai cherché plusieurs algorithmes basés sur des grappes ou des graphiques de détection de communauté, mais la plupart d'entre eux ne fonctionnent pas en raison des poids négatifs. Jusqu'à présent, j'ai appliqué un algorithme de spinglass (c'est ce qu'on appelle dans la bibliothèque igraph , c'est un algorithme basé sur le modèle de Potts) qui semble fonctionner avec des poids positifs et négatifs.
Existe-t-il d'autres algorithmes pour effectuer le clustering ou la détection de communauté sur des graphiques qui ont des poids de bord négatifs et positifs?
Mise à jour: les poids de bord représentent des corrélations, 1 signifie que deux sommets sont fortement corrélés, -1 qui sont inversement corrélés et 0 signifie qui sont indépendants.
Réponses:
Avez-vous essayé de mapper les valeurs à [0; 2]?
De nombreux algorithmes peuvent alors fonctionner.
Prenons par exemple Dijkstra: il nécessite des poids de bord non négatifs, mais si vous connaissez le minimum
a
des bords, vous pouvez l'exécuterx-a
et obtenir le chemin sans cycle le plus court.Mise à jour: pour les valeurs de corrélation, vous pouvez soit être intéressé par les valeurs absolues
abs(x)
(ce qui est la force de la corrélation!) , Soit vous pouvez fractionner temporairement le graphique en deux: d'abord regrouper uniquement les corrélations positives, puis les corrélations négatives uniquement si le signe est si important pour le clustering et que les approches précédentes ne fonctionnent pas.la source
Oui, il existe un algorithme appelé «propagation d'affinité» qui fonctionne avec des poids négatifs; Je crois que cela est implémenté dans sklearn (voir la documentation ici ). Une référence pour ce qui se passe dans les coulisses peut être trouvée ici .
J'espère que c'est ce que vous cherchez!
la source
Il me semble que le problème que vous décrivez est connu sous le nom de problème de regroupement de corrélation . Ces informations devraient vous aider à trouver certaines implémentations, telles que:
Notez que certains algorithmes de détection de communauté ont également été modifiés afin de traiter les réseaux signés, par exemple Amelio'13 , Sharma'12 , Anchuri'12 , etc. Cependant, je n'ai trouvé aucune implémentation accessible au public.
la source
Jetez un œil à ce code , il est assez évolutif, fonctionne avec des bords positifs et négatifs et résout le regroupement de corrélation (CC) comme un cas spécial (r = 0). Cependant, pour le cas du CC (maximisation des liens positifs et minimisation des liens négatifs à l'intérieur des grappes), je suggérerais d'autres méthodes spécialisées dans la résolution de cet objectif.
Pour illustrer, le clustering de corrélation (contrairement à ce que la littérature sur la détection communautaire poursuit) ne prend pas en compte la densité positive des clusters, donc quand un réseau n'a pas ou peu de liens négatifs (la plupart des cas réels), tout le réseau est mis en un seul grand grappe.
la source