k-medias || también conocido como K-Means escalable ++


12

Bahman Bahmani y col. introdujo k-means ||, que es una versión más rápida de k-means ++.

Inicialización de k-medias ||

Este algoritmo está tomado de la página 4 de su artículo , Bahmani, B., Moseley, B., Vattani, A., Kumar, R. y Vassilvitskii, S. (2012). Escalable k-significa ++. Actas de la Fundación VLDB , 5 (7), 622-633.

Desafortunadamente no entiendo esas elegantes letras griegas, así que necesito ayuda para entender cómo funciona esto. Por lo que yo entiendo, este algoritmo es una versión mejorada de k-means ++, y utiliza sobremuestreo, para reducir el número de iteraciones: k-means ++ tiene que iterar veces, donde k es el número de grupos deseados.kk

Obtuve una muy buena explicación a través de un ejemplo concreto de cómo funciona k-means ++, por lo que volveré a utilizar el mismo ejemplo.

Ejemplo

Tengo el siguiente conjunto de datos:

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

(número de grupos deseados)k=3

(factor de sobremuestreo)=2

Conjunto de datos de ejemplo para k-medias ||

Empecé a calcularlo, pero no estoy seguro de si lo hice bien, y no tengo idea de los pasos 2, 4 o 5.

  • Paso 1: muestrea un punto uniformemente al azar de XCX

    Digamos que el primer centroide es (igual que en k-means ++)(8,0)

  • Paso 2: ψϕX(C)

    ni idea

  • Paso 3:

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

      (8,0)

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

      =2

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

      =2[0,813)246.90659.42[379,495)[633,813)

    • O(logψ)ψ

  • xCwxXxC
  • Ck

Cualquier ayuda en general o en este ejemplo particular sería genial.

Respuestas:


10

puntos de datos: (7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9) , (8,0)

l = 2 // factor de sobremuestreo

k = 3 // no. de grupos deseados

Paso 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)}

Paso 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

Paso 3:

log(ψ)

XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) se explica en el paso 2.

El algoritmo es simplemente:

  • 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;

Etapa 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]++;
}

Paso 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)
  ... 
}  

Todos los pasos anteriores continúan, como en el caso de kmeans ++, con el flujo normal del algoritmo de agrupamiento

Espero que sea más claro ahora.

[Más tarde, más tarde editar]

También encontré una presentación hecha por autores, donde no se puede ver claramente que en cada iteración se puedan seleccionar varios puntos. La presentación está aquí .

[Más tarde editar el problema de @ pera]

log(ψ)

Clog(ψ)

Otra cosa a tener en cuenta es la siguiente nota en la misma página que dice:

En la práctica, nuestros resultados experimentales en la Sección 5 muestran que solo unas pocas rondas son suficientes para alcanzar una buena solución.

log(ψ)


¿podría extender su respuesta con el cálculo de mi ejemplo?
user1930254

Soy programador, creo que puedo escribir eso en el código más rápido que escribiendo aquí :). Espero que explique algo.
rapaio

¿Puede explicar cuál es la idea con el número de iteraciones log (Ksi)? No entiendo la idea subyacente, parece que el número de iteraciones dependerá del rango de valores de los objetos, lo que no parece razonable. Por ejemplo, si los objetos tienen valores de atributo de aproximadamente 1000, eso podría, por ejemplo, dar como resultado que el error sea de aproximadamente 1000, lo que significa que habrá 3 iteraciones. Por otro lado, si los valores están en el rango de 10, eso podría resultar en que el error es de aproximadamente 10, lo que resulta en 1 iteración. ¿No debería la cantidad de iteraciones depender de la cantidad de objetos?
Marko

@pera Actualizo la respuesta para aclarar el problema que
planteaste

@rapaio Gracias por su respuesta, ya voy por la solución que determinará la cantidad de iteraciones en función de la cantidad de medoides. Donde x se puede aumentar para obtener una mejor inicialización a costa de un par de iteraciones más. ¿Está bien eso de acuerdo con la segunda parte que ha dado? Gracias de nuevo.
Marko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.