Dans le cadre de mes recherches, je m'intéresse à la propagation d'étiquettes sur un graphe. Je suis particulièrement intéressé par ces deux méthodes:
- Xiaojin Zhu et Zoubin Ghahramani. Apprendre à partir de données étiquetées et non étiquetées avec propagation d'étiquettes. Rapport technique CMU-CALD-02-107, Université Carnegie Mellon, 2002 http://pages.cs.wisc.edu/~jerryzhu/pub/CMU-CALD-02-107.pdf
- Dengyong Zhou, Olivier Bousquet, Thomas Navin Lal, Jason Weston, Bernhard Schoelkopf. Apprendre avec une cohérence locale et mondiale (2004) http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.115.3219
J'ai vu que scikit-learn propose un modèle pour le faire. Cependant, ce modèle est censé être appliqué à des données vectorielles structurées ( c'est-à-dire des points de données).
Le modèle construit une matrice d'affinité à partir des points de données à l'aide d'un noyau, puis exécute l'algorithme sur la matrice construite. Je voudrais pouvoir entrer directement la matrice d'adjacence de mon graphique à la place de la matrice de similarité.
Une idée sur la façon d'y parvenir? Ou connaissez-vous une bibliothèque Python qui permettra d'exécuter la propagation d'étiquettes directement sur des données structurées par graphe pour les deux méthodes susmentionnées?
Merci d'avance pour votre aide!
la source
Réponses:
Répondre à ma propre question ici, car j'espère qu'elle sera utile à certains lecteurs.
Scikit-learn est principalement conçu pour traiter des données structurées vectorielles. Par conséquent, si vous souhaitez effectuer la propagation / la propagation d'étiquettes sur des données structurées sous forme de graphique, il est probablement préférable de réimplémenter la méthode vous-même plutôt que d'utiliser l'interface Scikit.
Voici une implémentation de la propagation d'étiquettes et de l'étalement d'étiquettes dans PyTorch.
Dans l'ensemble, les deux méthodes suivent les mêmes étapes algorithmiques, avec des variations sur la façon dont la matrice d'adjacence est normalisée et la façon dont les étiquettes sont propagées à chaque étape. Créons donc une classe de base pour nos deux modèles.
Le modèle prend en entrée la matrice d'adjacence du graphe ainsi que les étiquettes des nœuds. Les étiquettes sont sous la forme d'un vecteur d'un entier indiquant le numéro de classe de chaque nœud avec un -1 à la position des nœuds non étiquetés.
L'algorithme de propagation des étiquettes est présenté ci-dessous.
De Xiaojin Zhu et Zoubin Ghahramani. Apprendre à partir de données étiquetées et non étiquetées avec propagation d'étiquettes. Rapport technique CMU-CALD-02-107, Université Carnegie Mellon, 2002
Nous obtenons l'implémentation suivante.
L'algorithme d'étalement des étiquettes est:
De Dengyong Zhou, Olivier Bousquet, Thomas Navin Lal, Jason Weston, Bernhard Schoelkopf. Apprendre avec cohérence locale et mondiale (2004)
La mise en œuvre est donc la suivante.
Essayons maintenant nos modèles de propagation sur des données synthétiques. Pour ce faire, nous choisissons d'utiliser un graphe d'homme des cavernes .
Les modèles mis en œuvre fonctionnent correctement et permettent de détecter les communautés dans le graphique.
Remarque: Les méthodes de propagation présentées sont destinées à être utilisées sur des graphiques non orientés.
Le code est disponible en bloc - notes interactif Jupyter ici .
la source