Интересный вопрос.Спасибо, что обратили мое внимание на эту статью. Ссылка на PDF здесь оригинальной статьи.
Проще говоря, центры кластеров первоначально выбираются случайным образом из набора входных векторов наблюдений, где высока вероятность выбора вектора x
если x
не находится рядом с ранее выбранными центрами.
Вот одномерный пример.Наши наблюдения [0, 1, 2, 3, 4].Пусть первый центр, c1
, равен 0. Вероятность того, что следующий центр кластера, c2
, равен x, пропорциональна ||c1-x||^2
.Итак, P (c2 = 1) = 1a, P (c2 = 2) = 4a, P (c2 = 3) = 9a, P (c2 = 4) = 16a, где a = 1 / (1 + 4 + 9 +16).
Предположим, c2 = 4.Тогда P (c3 = 1) = 1a, P (c3 = 2) = 4a, P (c3 = 3) = 1a, где a = 1 / (1 + 4 + 1).
I 'мы кодировали процедуру инициализации в Python;Я не знаю, поможет ли это вам.
def initialize(X, K):
C = [X[0]]
for k in range(1, K):
D2 = scipy.array([min([scipy.inner(c-x,c-x) for c in C]) for x in X])
probs = D2/D2.sum()
cumprobs = probs.cumsum()
r = scipy.rand()
for j,p in enumerate(cumprobs):
if r < p:
i = j
break
C.append(X[i])
return C
РЕДАКТИРОВАТЬ с уточнением: Вывод cumsum
дает нам границы для разбиения интервала [0,1].Эти перегородки имеют длину, равную вероятности выбора соответствующей точки в качестве центра.Итак, поскольку r
равномерно выбран между [0,1], он попадет точно в один из этих интервалов (из-за break
).Цикл for
проверяет, в каком разделе находится r
.
Пример:
probs = [0.1, 0.2, 0.3, 0.4]
cumprobs = [0.1, 0.3, 0.6, 1.0]
if r < cumprobs[0]:
# this event has probability 0.1
i = 0
elif r < cumprobs[1]:
# this event has probability 0.2
i = 1
elif r < cumprobs[2]:
# this event has probability 0.3
i = 2
elif r < cumprobs[3]:
# this event has probability 0.4
i = 3