Closed TabouyT closed 5 years ago
@TabouyT You are not using the last version of the package in the vignette, so it is hard to tell...
I experienced the same issue, so I decided to get back to the old version of ICL smoothing, which consists in choosing the best model according to the best ICL (not the best vBound).*
@TabouyT I changed a bit your code in JSS and recompile everything : it seems to work fine with the last version. ICL_both_example.pdf
Copy that ! It's moving too fast ... ;)
Comparison with blockmodels under a full sampling not consistent anymore... :{
R code : `r library(blockmodels) mod = BM_bernoulli("SBM_sym",beligerent_adjacency) mod$estimate() table(apply(mod$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[3]]$fittedSBM$memberships)
`
I give you my ticket that it is because of ICL instead of J
You can keep your ticket : it is juste because of the initialization ("hierarchical" in place au "spectral") : The following piece of code is consistent with blockmodels
collection_sbm_full <-
missSBM::estimate(
sampledNet = prepare_data(beligerent_adjacency),
vBlocks = vBlocks, "node",
clusterInit = "spectral"
)
smooth(collection_sbm_full, "both")
I get
> table(apply(mod$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[3]]$fittedSBM$memberships)
1 2 3
1 0 0 35
2 42 0 0
3 0 15 0
SO shall we always initialize with spectral clustering ? Hard to say...
I am closing this because it is not due to smoothing, but initialization
Well,
Il semblerait que le smoothing de l'ICL soit de retour.
Pour conclure, on fait ? Soit on utilise le J, mais on ne peut pas véritablement parler de smoothing de l'ICL dans ce cas. Soit on laisse le choix à l'utilisateur de lisser selon l'ICL ou la borne variationelle
D'autres idées ? Une opinion ? @Demiperimetre @TabouyT
...
Compliqué …
Le 11 avr. 2019 à 23:09, Pierre Barbillon notifications@github.com a écrit :
...
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-482314930, or mute the thread https://github.com/notifications/unsubscribe-auth/AbRNCnInKq-T-sQDD0ugyLEOzwG2yQF0ks5vf6RsgaJpZM4ck-AY.
J'ai fait tourner le code du JSS. J'ai l'impression qu'il n'y a rien de catastrophique dans la mesure où le minimum est bien marqué ! Je serai d'avis à laisser le J s'il n'y a pas de trucs plus catastrophiques que ça quitte à faire une remarque dans le texte pour dire que c'est l'entropie qui peut fausser un lisssage... Je vais essayer d'explorer les cas où il y a des montagnes russes pour comprendre s'il n'y a pas un truc bizarre à ce niveau
J'ai pushé sur le git document/papier-JSS les résultats sauvegardés et qq plots qui ont l'air d'indiquer que le problème de l'ICL vient de l'espérance du SBM.
it is called strange.R
a new smoothing proposition ??
merci, je regarde ça ce matin (12/04/2019)
Je pense avoir réconcilié la @Demiperimetre (vignette) et @TabouyT (JSS) en remplçant la fonction de split dans le forward par un sample sample (plutôt qu'un classif hiérarchique).
La classification en full observed est toujours cohérente avec BM !
Bon ... Le nouveau smoothing fait n'importe quoi sur les données de la blogosphère ... L'ICL est dégradé après 2 tours de lissage et à une mine affreuse par rapport à ne à lisser ...
Ça marche ? Sinon @TabouyT, tu peux extraire un Rdata avec la classif du smoothing pour vérifier ce qu'il se passe
on est repassé à ICL plutôt que J à nombre de classes fixées ?
@Demiperimetre
on est repassé à ICL plutôt que J à nombre de classes fixées ?
Oui... Faudrait tester voir si blockmodels fait toujours pareil. Je pense (j'espère) que les inconsistences étaient plutôt dues à la méthode de découpage des groupes (maintenant random, avant avec clustering hiérarchique).
et non c'est à nouveau le même problème. De plus, j'ai des warnings inquiétants de la fonction estimate Warning messages:nference for model with 6 blocks. 1: did not converge in 100 iterations 2: Quick-TRANSfer stage steps exceeded maximum (= 4150)
Est ce un autre problème ?
Warning messages:nference for model with 6 blocks. 1: did not converge in 100 iterations 2: Quick-TRANSfer stage steps exceeded maximum (= 4150)
Ce sont les k-means associés au spectral clustering qui n'ont pas convergé à l'initialisation
c'est étrange non alors que je suis sur les données complètes... On n'avait jamais eu ce message avant sur les mêmes données ?
Jamais de mon coté …
Le 18 avr. 2019 à 19:00, Pierre Barbillon notifications@github.com a écrit :
c'est étrange non alors que je suis sur les données complètes... On n'avait jamais eu ce message avant sur les mêmes données ?
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-484592809, or mute the thread https://github.com/notifications/unsubscribe-auth/AG2E2CQCO66GTALTTBPCLM3PRCSL7ANCNFSM4HET4AMA.
Tu ne veux pas mettre ton bout de code ici stp ?
J'ai p-e changé le nombre d'itération max ou min dans le k-means
`r
data("war") library(igraph) B2 = as.matrix(get.adjacency(war$beligerent))
vBlocks <- 1:6 B2 = prepare_data(B2) collection_sbm_full <- missSBM::estimate(B2,vBlocks = vBlocks, "node") smooth(collection_sbm_full, "both") plot(collection_sbm_full$ICL, type = "l")
`
Il ne te plait pas l'ICL dans ce cas ? Moi je le trouve beau.
oui mais la classif est déconnante par rapport à blockmodels
`r library(blockmodels) mod2b = BM_bernoulli("SBM_sym",B2) mod2b$estimate()
table(apply(mod2b$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[3]]$fittedSBM$memberships)
`
De mon coté, enfin missSBM trouve le même nombre de classes que block models sans données manquantes.
Le 18 avr. 2019 à 19:07, Pierre Barbillon notifications@github.com a écrit :
`r library(blockmodels) mod2b = BM_bernoulli("SBM_sym",B2) mod2b$estimate()
table(apply(mod2b$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[3]]$fittedSBM$memberships)
`
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-484595019, or mute the thread https://github.com/notifications/unsubscribe-auth/AG2E2CTFSPXIZB6QXVHGUTLPRCTGTANCNFSM4HET4AMA.
rm(list=ls())
library(igraph)
library(missSBM)
library(blockmodels)
data("war")
B2 = as.matrix(get.adjacency(war$beligerent))
vBlocks <- 1:6
B3 = prepare_data(B2)
collection_sbm_full <- missSBM::estimate(B3,vBlocks = vBlocks, "node",clusterInit = "hierarchical")
smooth(collection_sbm_full, "both")
plot(collection_sbm_full$ICL, type = "l")
mod2b = BM_bernoulli("SBM_sym",B2)
mod2b$estimate()
# initialize from blockmodels
collection_sbmBM3 <- missSBM::estimate(B3,vBlocks = 3, "node",clusterInit = apply(mod2b$memberships[[3]]$Z,1,which.max))
collection_sbmBM3$bestModel$fittedSBM$vICL
# comparing ICLs
mod2b$ICL[3]*-2
collection_sbm_full$bestModel$fittedSBM$vICL
collection_sbmBM3$bestModel$fittedSBM$vICL
# comparing clustering
Q=3
table(apply(mod2b$memberships[[Q]]$Z,1,which.max),collection_sbm_full$models[[Q]]$fittedSBM$memberships)
table(apply(mod2b$memberships[[Q]]$Z,1,which.max),collection_sbmBM3$bestModel$fittedSBM$memberships)
si on initialize avec blocmodel on est très proche mais l'icl est de 2 points moins bon. Je pense que ça peut être dû aux bornages des tau dans le VEM. À un moment on pouvait le bloquer dans les controles, j'ai l'impression que ce n'est plus possible
# icl
iclalamano = function(pi,alpha,Z,adj)
{
adj0 = 1-adj
diag(adj0) = 0
vA = 0
for (i in 2:nrow(adj))
for (j in 1:(i-1))
for (q in 1:ncol(Z))
for (l in 1:ncol(Z))
vA = vA + Z[i,q]*Z[j,l]*(log(pi[q,l])*adj[i,j]+log(1-pi[q,l])*adj0[i,j])
return(vA + sum(Z%*%log(alpha)))
}
pismooth = collection_sbm_full$bestModel$fittedSBM$connectParam
alphasmooth = collection_sbm_full$bestModel$fittedSBM$mixtureParam
Zsmooth = collection_sbm_full$bestModel$fittedSBM$blocks
pi3 = collection_sbmBM3$bestModel$fittedSBM$connectParam
alpha3 = collection_sbmBM3$bestModel$fittedSBM$mixtureParam
Z3 = collection_sbmBM3$bestModel$fittedSBM$blocks
piBM = mod2b$model_parameters[[3]]$pi
alphaBM = colMeans(mod2b$memberships[[3]]$Z)
ZBM = mod2b$memberships[[3]]$Z
-2*iclalamano(pismooth,alphasmooth,Zsmooth,B2) + log(nrow(B2)) * (ncol(Zsmooth)-1) + log(nrow(B2)*(nrow(B2)-1)/2)* (ncol(Zsmooth)+1)*ncol(Zsmooth)/2
-2*iclalamano(pi3,alpha3,Z3,B2) + log(nrow(B2)) * (ncol(Z3)-1) + log(nrow(B2)*(nrow(B2)-1)/2)* (ncol(Z3)+1)*ncol(Z3)/2
-2*iclalamano(piBM,alphaBM,ZBM,B2) + log(nrow(B2)) * (ncol(ZBM)-1) + log(nrow(B2)*(nrow(B2)-1)/2)* (ncol(ZBM)+1)*ncol(ZBM)/2
quand j'ajoute un seuil sur les valeurs de tau, les valeurs d'icl calculées à la main sont très différentes de celles données dans la classe
quand j'ajoute un seuil sur les valeurs de tau, les valeurs d'icl calculées à la main sont très différentes de celles données dans la classe
@Demiperimetre ce qui veut dire ? Tu vois une manière de changer le code qui solutionnerait le problème ?
non qu'il se passe qq chose d'étrange entre l'icl qu'il calcule et celui que je calcule à la main. Cela veut peut être dire qu'il n'utilise pas ce qu'il faut lorsqu'il compare les modèles ?
non qu'il se passe qq chose d'étrange entre l'icl qu'il calcule et celui que je calcule à la main. Cela veut peut être dire qu'il n'utilise pas ce qu'il faut lorsqu'il compare les modèles ?
C'est qui "il" ?
l'algo de smoothing
vBlocks <- 1:6
B3 = prepare_data(B2)
collection_sbm_full <- missSBM::estimate(B3,vBlocks = vBlocks, "node",clusterInit = "spectral")
collection_sbm_full$ICL
collection_sbm_full$bestModel$fittedSBM$vICL
pibrut = collection_sbm_full$bestModel$fittedSBM$connectParam
alphabrut = collection_sbm_full$bestModel$fittedSBM$mixtureParam
Zbrut = collection_sbm_full$bestModel$fittedSBM$blocks
-2*iclalamano(pibrut,alphabrut,Zbrut,B2) + log(nrow(B2)) * (ncol(Zbrut)-1) + log(nrow(B2)*(nrow(B2)-1)/2) * (ncol(Zbrut)+1)*ncol(Zbrut)/2
toujours le même problème. Le truc que je n'arrive pas à comprendre dans le code c'est à quel moment, on calcule les Vexpec, on dirait qu'il n'utilise pas les valeurs de pi, alpha, Z qu'il renvoie...
Bon,
je ne sais pas ce qu'il s'était passé, mais manifestement une des corrections que j'avais faite dans le calcul de la borne variationnelle n'avait pas été pushé. Sans doute un conflit mal résolu.
Je trouve désormais pareil que "ICL à la Mano".
Et j'ai viré le code de update_block, l'ancien apparemment faisait le job.
@TabouyT @Demiperimetre Merci de faire retourner tout avec le dernier code pour qu'on en finisse...
Bon,
Le calcule de l'ICL est désormais correct. On ne trouve pas comme blockmodel à nombre fixe de classe pour l'exemple de guerre mais il s'agit sans doute d'une question d'initialisation. On pourrait envisager d'utiliser le kmeans de blockmodels pour initialiser, c'est p-e ça le soucis.
En tout cas je reviens au smoothing de l'ICL : j'ai essayé toutes les configurations (tau, ICL, vBound) et celle qui me paraît la plus juste vis à vis de l'exemple de JSS et celle sans le filtre sur les tau et avec le smoothing de l'ICL.
Et dans ce cas au moins le code suivant est cohérent entre blockmodel et nous. Je regarderai cette histoire d'initialisation avec les kmeans de blockmodel plutôt ue ceux de R, c'est p-e ça le soucis
data("war")
library(igraph)
B2 = as.matrix(get.adjacency(war$beligerent))
library(blockmodels)
mod2b = BM_bernoulli("SBM_sym",B2)
mod2b$estimate()
B3 = prepare_data(B2)
# collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node")
collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node", clusterInit = list(apply(mod2b$memberships[[3]]$Z,1,which.max)))
print(table(apply(mod2b$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[1]]$fittedSBM$memberships))
Les dernières modifications marche bien de mon coté, j’ai un exemple satisfaisant.
T.
Le 27 avr. 2019 à 10:34, Julien Chiquet notifications@github.com a écrit :
Bon,
Le calcule de l'ICL est désormais correct. On ne trouve pas comme blockmodel à nombre fixe de classe pour l'exemple de guerre mais il s'agit sans doute d'une question d'initialisation. On pourrait envisager d'utiliser le kmeans de blockmodels pour initialiser, c'est p-e ça le soucis.
En tout cas je reviens au smoothing de l'ICL. Et au moins le code suivant est cohérent
data("war") library(igraph) B2 = as.matrix(get.adjacency(war$beligerent))
library(blockmodels) mod2b = BM_bernoulli("SBM_sym",B2) mod2b$estimate()
B3 = prepare_data(B2)
collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node")
collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node", clusterInit = list(apply(mod2b$memberships[[3]]$Z,1,which.max)))
print(table(apply(mod2b$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[1]]$fittedSBM$memberships)) — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-487267382, or mute the thread https://github.com/notifications/unsubscribe-auth/AG2E2CTQFND5CA66MVMSDE3PSQFY7ANCNFSM4HET4AMA.
De mon côté, j'obtiens les mêmes résultats. Lorsqu'on lance le smoothing de missSBM on tombe sur un ICL plus faible de 2 points pour une classification totalement différente de blockmodels. Ce qu'il y a de bizarre est que blockmodel donne un ICL de 1267, missSBM avec l'initialisation SBM 1273 et en lissant à partir d'un spectral 1271. Je ne comprends pas d'où vient cette différence de 4-5 points, j'avais supposé que c'était dû au seuillage sur les taus.
Mais tant pis, on a déjà passé assez de temps là-dessus. Si ça marche pour l'exemple du JSS c'est bien. Pour la vignette je vais analyser avec la classif de missSBM.
+++ P.
Le sam. 27 avr. 2019 à 10:26, Tabouy Timothée notifications@github.com a écrit :
Les dernières modifications marche bien de mon coté, j’ai un exemple satisfaisant.
T.
Le 27 avr. 2019 à 10:34, Julien Chiquet notifications@github.com a écrit :
Bon,
Le calcule de l'ICL est désormais correct. On ne trouve pas comme blockmodel à nombre fixe de classe pour l'exemple de guerre mais il s'agit sans doute d'une question d'initialisation. On pourrait envisager d'utiliser le kmeans de blockmodels pour initialiser, c'est p-e ça le soucis.
En tout cas je reviens au smoothing de l'ICL. Et au moins le code suivant est cohérent
data("war") library(igraph) B2 = as.matrix(get.adjacency(war$beligerent))
library(blockmodels) mod2b = BM_bernoulli("SBM_sym",B2) mod2b$estimate()
B3 = prepare_data(B2)
collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node")
collection_sbm_full <- missSBM::estimate(B3, vBlocks = 3, "node", clusterInit = list(apply(mod2b$memberships[[3]]$Z,1,which.max)))
print(table(apply(mod2b$memberships[[3]]$Z,1,which.max),collection_sbm_full$models[[1]]$fittedSBM$memberships)) — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub < https://github.com/jchiquet/missSBM/issues/33#issuecomment-487267382>, or mute the thread < https://github.com/notifications/unsubscribe-auth/AG2E2CTQFND5CA66MVMSDE3PSQFY7ANCNFSM4HET4AMA .
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-487290424, or mute the thread https://github.com/notifications/unsubscribe-auth/AHP4KVT6Z3FE5KQPVFIPNL3PSRPB5ANCNFSM4HET4AMA .
-- Pierre Barbillon https://www6.inra.fr/mia-paris/Equipes/Membres/Pierre-Barbillon
Ok, mais gardons cette issue ouverte... Ça serait bien qu'un jour on fasse exactement comme blockmodels su cet exemple... P-e un problème d'optim, de point fixe... Je ne sais pas.
Ok, je propose quand même d'arrêter de se triturer l'esprit pour peu, c'est sans doute comme dit julien des petits réglages qui un coup donneront l'avantage à l'un puis un autre coup à l'autre. On avance.
T.
Le lun. 29 avr. 2019 à 07:25, Julien Chiquet notifications@github.com a écrit :
Ok, mais gardons cette issue ouverte... Ça serait bien qu'un jour on fasse exactement comme blockmodels su cet exemple... P-e un problème d'optim, de point fixe... Je ne sais pas.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jchiquet/missSBM/issues/33#issuecomment-487454982, or mute the thread https://github.com/notifications/unsubscribe-auth/AG2E2CWPNSGVOXC5S7GV7GDPS2BFBANCNFSM4HET4AMA .
Ok, donc ça serait cool qu'on ait une proposition complète pour la vignette à mon retour de vacances que je puisse soumettre au CRAN ...
:s
The smooth function doesn't always improve the estimation, it makes it even worst and it shouldn't be ... Example with R code in JSS paper (.Rnw code)... See the ggplot attached with this issue
Rplot01.pdf