k-means || alias K-Means scalabili ++


12

Bahman Bahmani et al. introdotto k-mean ||, che è una versione più veloce di k-mean ++.

Inizializzazione di k-medie ||

Questo algoritmo è tratto da pagina 4 del loro articolo , Bahmani, B., Moseley, B., Vattani, A., Kumar, R., e Vassilvitskii, S. (2012). K-medie scalabili ++. Atti del VLDB Endowment , 5 (7), 622-633.

Sfortunatamente non capisco quelle fantasiose lettere greche, quindi ho bisogno di aiuto per capire come funziona. Per quanto ho capito, questo algoritmo è una versione migliorata di k-mean ++, e utilizza il sovracampionamento, per ridurre il numero di iterazioni: k-mean ++ deve iterare volte, dove è il numero di cluster desiderati.kkk

Ho ottenuto un'ottima spiegazione attraverso un esempio concreto di come funziona k-mean ++, quindi userò di nuovo lo stesso esempio.

Esempio

Ho il seguente set di dati:

(7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9), (8 , 0)

k=3 (numero di cluster desiderati)

=2 (fattore di sovracampionamento)

Set di dati di esempio per k-medie ||

Ho iniziato a calcolarlo, ma non sono sicuro di averlo fatto bene e non ho idea dei passaggi 2, 4 o 5.

  • Passaggio 1: campiona un punto uniformemente a caso daXCX

    Supponiamo che il primo centroide sia (uguale a in k-means ++)(8,0)

  • Passaggio 2:ψϕX(C)

    nessuna idea

  • Passaggio 3:

    • d2(x,C)=[2,41,74,73,58,65,4,90]

      Calcoliamo le distanze al centro più vicino a ciascun punto. In questo caso finora abbiamo un solo centro .(8,0)

    • d2(x,C)=[4,81,148,146,116,130,8,180]

      (Perché in questo caso.)=2

    • cumulative d2(x,C)=[4,85,233,379,495,625,633,813]

      Scegli numeri casuali nell'intervallo . Di 'che scegli e . Esse rientrano negli intervalli e che corrispondono rispettivamente al 4 ° e 8 ° elemento.[ 0 , 813 ) 246,90 659,42 [ 379 , 495 ) [ 633 , 813 )=2[0,813)246.90659.42[379,495)[633,813)

    • Ripetilo volte, ma cosa è (calcolato nel passaggio 2) in questo caso? ψO(logψ)ψ

  • Passaggio 4: Per , imposta per essere il numero di punti in più vicino a rispetto a qualsiasi altro punto in .p x X x CxCwxXxC
  • Passaggio 5: riorganizzare i punti ponderati in in gruppi. kCk

Qualsiasi aiuto in generale o in questo esempio particolare sarebbe grandioso.

Risposte:


10

punti dati: (7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9) , (8,0)

l = 2 // fattore di sovracampionamento

k = 3 // no. dei cluster desiderati

Passo 1:

C{c1}={(8,0)}X={x1,x2,x3,x4,x5,x6,x7,x8}={(7,1),(3,4),(1,5),(5,8),(1,3),(7,8),(8,2),(5,9)}

Passo 2:

ϕX(C)XCXCX

dC2(xi)xiCψ=i=1ndC2(xi)

CXdC2(xi)Cxiϕ=i=1n||xic||2

ψ=i=1nd2(xi,c1)=1.41+6.4+8.6+8.54+7.61+8.06+2+9.4=52.128 log(ψ)=log(52.128)=3.95=4(rounded)

C

Passaggio 3:

log(ψ)

XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) è spiegato al passaggio 2.

L'algoritmo è semplicemente:

  • Xxi
  • xipxi
  • [0,1]pxiC
  • CC

lX

for(int i=0; i<4; i++) {

  // compute d2 for each x_i
  int[] psi = new int[X.size()];
  for(int i=0; i<X.size(); i++) {
    double min = Double.POSITIVE_INFINITY;
    for(int j=0; j<C.size(); j++) {
      if(min>d2(x[i],c[j])) min = norm2(x[i],c[j]);
    }
    psi[i]=min;
  }

  // compute psi
  double phi_c = 0;
  for(int i=0; i<X.size(); i++) phi_c += psi[i];

  // do the drawings
  for(int i=0; i<X.size(); i++) {
    double p_x = l*psi[i]/phi;
    if(p_x >= Random.nextDouble()) {
      C.add(x[i]);
      X.remove(x[i]);
    }
  }
}
// in the end we have C with all centroid candidates
return C;

Passaggio 4:

wC0XxiXjCw[j]1w

double[] w = new double[C.size()]; // by default all are zero
for(int i=0; i<X.size(); i++) {
  double min = norm2(X[i], C[0]);
  double index = 0;
  for(int j=1; j<C.size(); j++) {
    if(min>norm2(X[i],C[j])) {
      min = norm2(X[i],C[j]);
      index = j;
    }
  }
  // we found the minimum index, so we increment corresp. weight
  w[index]++;
}

Passaggio 5:

wkkp(i)=w(i)/j=1mwj

for(int k=0; k<K; k++) {
  // select one centroid from candidates, randomly, 
  // weighted by w
  // see kmeans++ and you first idea (which is wrong for step 3)
  ... 
}  

Tutti i passaggi precedenti continuano, come nel caso di kmeans ++, con il normale flusso dell'algoritmo di clustering

Spero sia più chiaro ora.

[Più tardi, più tardi modifica]

Ho trovato anche una presentazione fatta dagli autori, in cui non è possibile chiaramente che ad ogni iterazione possano essere selezionati più punti. La presentazione è qui .

[Successivamente modifica il problema di @ pera]

log(ψ)

Clog(ψ)

Un'altra cosa da notare è la seguente nota sulla stessa pagina che afferma:

In pratica, i nostri risultati sperimentali nella Sezione 5 mostrano che bastano pochi round per raggiungere una buona soluzione.

log(ψ)


potresti estendere la tua risposta con il calcolo per il mio esempio?
user1930254

Sono un programmatore, penso di poterlo scrivere nel codice più velocemente che scrivere qui :). Spero che spieghi l'algo.
Rapaio,

Puoi spiegare qual è l'idea con il numero di iterazioni log (Ksi)? Non capisco l'idea sottostante, sembra che il numero di iterazioni dipenderà dall'intervallo di valori degli oggetti, il che non sembra ragionevole. Ad esempio, se gli oggetti hanno valori di attributo di circa 1000, ciò potrebbe, ad esempio, determinare che l'errore è di circa 1000, il che significa che ci saranno 3 iterazioni. D'altra parte, se i valori sono compresi nell'intervallo 10, ciò potrebbe comportare che l'errore sia di circa 10, con conseguente 1 iterazione. Il numero di iterazioni non dovrebbe dipendere dal numero di oggetti?
Marko,

@pera aggiorno la risposta per chiarire il problema che hai sollevato
rapaio

@rapaio Grazie per la tua risposta, sto già cercando la soluzione che determinerà il numero di iterazioni in base al numero di medoidi. Dove x può essere aumentato per ottenere una migliore inizializzazione al costo di un paio di iterazioni in più. Va bene così, in base alla seconda parte che hai dato? Grazie ancora.
Marko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.