К средних || aka Scalable K-Means ++

12

Бахман Бахмани и соавт. представил k-means ||, который является более быстрой версией k-means ++.

Инициализация k-средних ||

Этот алгоритм взят из страницы 4 их работы , Бахмани Б., Мозли Б., Ваттани А., Кумар Р. и Васильвицкий С. (2012). Масштабируемое k-означает ++. Труды фонда VLDB , 5 (7), 622-633.

К сожалению, я не понимаю эти причудливые греческие буквы, поэтому мне нужна помощь, чтобы понять, как это работает. Насколько я понимаю, этот алгоритм является улучшенной версией k-means ++, и он использует передискретизацию для сокращения числа итераций: k-means ++ должен выполнить итерацию раз, где kkk - количество требуемых кластеров.

Я получил очень хорошее объяснение на конкретном примере того, как работает k-means ++, поэтому я снова буду использовать тот же пример.

пример

У меня есть следующий набор данных:

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

(количество желаемых кластеров)k=3

(коэффициент передискретизации)=2

Пример набора данных для k-средних ||

Я начал вычислять это, но я не уверен, правильно ли я понял, и понятия не имею о шагах 2, 4 или 5.

  • Шаг 1: выборка точки случайным образом из XCX

    Скажем, первый центроид (такой же, как в k-means ++)(8,0)

  • Шаг 2: ψϕX(C)

    без понятия

  • Шаг 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]

      Выберите случайных числа в интервале [ 0 , 813 )=2[0,813) . Допустим, вы выбрали и 659,42 . Они попадают в диапазоны [ 379 , 495 ) и [ 633 , 813 ), которые соответствуют 4-му и 8-му пунктам соответственно.246.90659.42[379,495)[633,813)

    • Повторите это раз, но что такое ψ (рассчитывается на шаге 2) в этом случае? O(logψ)ψ

  • Шаг 4: Для , множество ш й будет число точек в X ближе к й , чем любой другой точке C .xCwxXxC
  • Шаг 5: Перегруппируйте взвешенные точки в в k кластеров.Ck

Любая помощь в целом или в этом конкретном примере будет отличной.

user1930254
источник

Ответы:

10

Точки данных: (7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9) , (8,0)

l = 2 // коэффициент передискретизации

k = 3 // нет. желаемых кластеров

Шаг 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)}

Шаг 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

Шаг 3:

log(ψ)

XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) объясняется на шаге 2.

Алгоритм прост:

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

Шаг 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]++;
}

Шаг 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)
  ... 
}  

Все предыдущие шаги продолжаются, как в случае с kmeans ++, с нормальным потоком алгоритма кластеризации

Надеюсь, теперь стало понятнее.

[Позже, позже отредактируйте]

Я также нашел презентацию, сделанную авторами, в которой вы не можете ясно, что на каждой итерации может быть выбрано несколько точек. Презентация здесь .

[Позже отредактируйте проблему @ pera]

log(ψ)

Clog(ψ)

Еще одна вещь, которую стоит отметить, это следующее примечание на той же странице, где говорится:

На практике наши экспериментальные результаты в разделе 5 показывают, что для достижения хорошего решения достаточно всего нескольких раундов.

log(ψ)

rapaio
источник
не могли бы вы дополнить свой ответ расчетом для моего примера?
user1930254
Я программист, я думаю, что могу написать это в коде быстрее, чем набирать здесь :). Надеюсь, это объясняет алгоритм.
rapaio
Не могли бы вы объяснить, что это за идея с log (Ksi) числом итераций? Я не понимаю идею, лежащую под ним, кажется, что число итераций будет зависеть от диапазона значений объектов, что не представляется разумным. Например, если объекты имеют значения атрибута около 1000, это может привести, например, к ошибке около 1000, что означает, что будет 3 итерации. С другой стороны, если значения находятся в диапазоне 10, это может привести к тому, что ошибка будет около 10, что приведет к 1 итерации. Разве число итераций не должно зависеть от количества объектов?
Марко
@pera Я обновляю ответ, чтобы уточнить вопрос, который вы подняли
rapaio
@rapaio Спасибо за ваш ответ, я уже собираюсь найти решение, которое определит количество итераций в зависимости от количества медоидов. Где х можно увеличить, чтобы получить лучшую инициализацию за счет нескольких итераций. У вас все хорошо, на основании второй части, которую вы дали? Еще раз спасибо.
Марко