R calcolo della misura di non omogeneità nei cluster

di il
2 risposte

R calcolo della misura di non omogeneità nei cluster

Salve a tutti, sono impantanato sul calcolo della misura di non omogeneità sui cluster, in pratica ho un data.frame che contiene al suo interno le nascite, i morti e la popolazione totale(maschile e femminile per ogni regione italiana).
ho eseguito la suddivisione in cluster tramite le seguenti righe di codice:

dataframeTotPopolazione<-data.frame(dataset$`pop. al primo gennaio Maschi`,dataset$`pop. al primo gennaio Femmine`)
  row.names(dataframeTotPopolazione)<-labs
  d<-dist(dataframeTotPopolazione,method="euclidean",diag=TRUE,upper=TRUE)
  hls<-hclust(d,method = "single")
  plot(hls,hang=-1)
  axis(side=4,at=round(c(0,hls$height),2))
  rect.hclust(hls,k=2,border = "red")
  taglio<-cutree(hls,k=2,h=NULL)
  print(taglio)
usando quindi il metodo euclideo a distanza singola.
ora però devo fare il calcolo della misura di non omogeneità, ma sono bloccato, ho scritto le seguenti righe di codice:

dataframeTotPopolazione<-data.frame(dataset$`pop. al primo gennaio Maschi`,dataset$`pop. al primo gennaio Femmine`)
  #calcolo la misura di non omogenità statistica
  n<-nrow(dataset)
  trHI<-(n-1)*sum(apply(dataframeTotPopolazione, 2, var))
  d<-dist(dataframeTotPopolazione,method = "euclidean",diag = TRUE,upper = TRUE) #individua la struttura di dissimilità
  hls<-hclust(d,method = "single")
  taglio<-cutree(hls,k=2,h=NULL)
  num<-table(taglio)
  taglioList<-list(taglio)
  agvar<-aggregate(dataframeTotPopolazione,taglioList,var)[,-1]
  trH1<-(num[[1]]-1)*sum(agvar[1,])
  print("trH1:")
  print(trH1)
  trH2<-(num[[2]]-1)*sum(agvar[2,]) #sum(agvar[2,]) risulta NA
  print(trH2)
  within<-trH1+trH2
  between<-trHI-within
  print(between)
  print(between/trHI)
ma tale riga trH2<-(num[[2]]-1)*sum(agvar[2,]) #sum(agvar[2,]) risulta NA
non so come posso procedere, la prof, nei suoi appunti per fare questi calcoli utilizza sempre 2 dataframe distinti, io invece ho un unico data.frame che dovrei "splittare" in due data.frame in base alla clusterizzazione se ho ben capito, ma non riesco a venirne a capo.
Qualcuno può aiutarmi?
grazie

2 Risposte

  • Re: R calcolo della misura di non omogeneità nei cluster

    Primo, non esiste un solo indice: purity, rand index e diversi altri

    Secondo: ti servono DUE informazioni
    1) l'appartenenza al cluster
    2) una qualche classificazione gia' presente nei dati
  • Re: R calcolo della misura di non omogeneità nei cluster

    migliorabile ha scritto:


    Primo, non esiste un solo indice: purity, rand index e diversi altri

    Secondo: ti servono DUE informazioni
    1) l'appartenenza al cluster
    2) una qualche classificazione gia' presente nei dati
    perdonami, ora mi stò approcciando allo studio dei cluster, gli indici che dici tu purty,rand index, non sono proprio citati dalla prof. quindi non riesco a capire a cosa fai riferimento.

    con la prima funzione descritta da me sopra "credo se ho ben capito le dispense della prof." che ho fatto una classificazione in cluster con k-means(impostando come parametro k=2 (il numero dei cluster)) e infatti ho avuto un partizionamento con 2 cluster, uno contenente 9 regioni e una contenente 11 regioni(la classificazione da me scelta è quella di partizionarli in base al numero di abitanti per regione).
    quindi presumo cche queste 2 informazioni siano presenti, o sbaglio?
    grazie:-)
    [EDIT] cambiando la riga
      agvar<-aggregate(dataframeTotPopolazione,tl,var)[-1]
    
    in
      agvar<-aggregate(dataframeTotPopolazione,tl,mean)[-1]
    
    il metodo non da più problemi, l'interprete riesce a dare degli output, volevo però confrontare l'output ottenuto da kmeans
    
    dataframeTotPopolazione<-data.frame(dataset$`pop. al primo gennaio Maschi`,dataset$`pop. al primo gennaio Femmine`)
      row.names(dataframeTotPopolazione)<-labs
      d<-dist(dataframeTotPopolazione,method ="euclidean",diag = TRUE,upper=TRUE)
      d<-d^2
      tree<-hclust(d,method = "centroid")
      taglio<-cutree(tree,k=mk,h=NULL)
      taglioList<-list(taglio)
      centroidiIniziali<-aggregate(dataframeTotPopolazione,taglioList,mean)[-1]
      km<-kmeans(dataframeTotPopolazione,centers = centroidiIniziali,iter.max = 10,nstart = 2)
      print(km)
        plot(dataframeTotPopolazione,col=km$cluster,main = "metodo k-means")
      points(km$center,col=1:2,pch=8,cex=1)
    
    questa funzione su un partizionamento con 2 cluster mi da between_SS / total_SS = 73.8 %
    con quello scritto da me per le funzioni di non omogeneità
    
    dataframeTotPopolazione<-data.frame(dataset$`pop. al primo gennaio Maschi`,dataset$`pop. al primo gennaio Femmine`)
      row.names(dataframeTotPopolazione)<-labs
      n<-nrow(dataset)
      trHI<-(n-1)*sum(apply(dataframeTotPopolazione,2, var))
      d<-dist(dataframeTotPopolazione,method = dist,diag = TRUE,upper = TRUE) #individua la struttura di dissimilità dist="euclidean"
      hls<-hclust(d,method = aggr)#aggr="centroid"
      taglio<-cutree(hls,k=mk,h=NULL)
      num<-table(taglio)
      tl<-list(taglio)
      agvar<-aggregate(dataframeTotPopolazione,tl,mean)[-1]
      t1<-(num[[1]]-1)*sum(agvar[1, ])
      t2<-(num[[2]]-1)*sum(agvar[2,])
      print(t2)
      w<-t1+t2
      b<-trHI-w
      print("b/trHI")
      print((b/trHI*100))
    
    questa funzione INDIPENDENTEMENTE DAI CRITERI SCELTI (ho provato tutti quelli degli appunti della prof...euclidean con single complete median centroid e manhattan con single complete etc...
    da sempre come output 99.999995
    CREDO di aver sbagliato qualcosa in quanto NON mi trovo mai il valore 73.8% ....potresti darmi qualche dritta? te ne sarei molto grato....stò leggendo e rileggendo i suoi appunti e cercando online, ma non riesco a capire se effettivamente mi trovo....ti dico ciò perché chiedendo ad un mio collega di corso lui bene o male si trova in tutti i casi lo stesso output sia con la funzione k-means sia con la misura di non omogeneità(la seconda funzione) il che mi porta a pensare di stare sbagliando qualcosaa.
Devi accedere o registrarti per scrivere nel forum
2 risposte