Interesante pregunta. Gracias por traer este documento a mi atención. PDF link here of the original paper.
En términos simples, centros de los conglomerados se eligen inicialmente al azar a partir del conjunto de vectores de observación de entrada, donde la probabilidad de elegir vector x
es alta si x
no está cerca de cualquiera de los centros seleccionados previamente.
Aquí hay un ejemplo unidimensional. Nuestras observaciones son [0, 1, 2, 3, 4]. Deje que el primer centro, c1
, sea 0. La probabilidad de que el siguiente centro de clúster, c2
, sea x es proporcional a ||c1-x||^2
. Entonces, P (c2 = 1) = 1a, P (c2 = 2) = 4a, P (c2 = 3) = 9a, P (c2 = 4) = 16a, donde a = 1/(1 + 4 + 9 + dieciséis).
Suponer c2 = 4. Entonces, P (c3 = 1) = 1a, P (c3 = 2) = 4a, P (c3 = 3) = 1a, donde a = 1/(1 + 4 + 1).
He codificado el procedimiento de inicialización en Python; No sé si esto te ayuda.
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
edición con una aclaración: La salida de cumsum
nos da límites para dividir el intervalo [0,1]. Estas particiones tienen una longitud igual a la probabilidad de que se elija el punto correspondiente como centro. Entonces, dado que r
se elige uniformemente entre [0,1], caerá exactamente en uno de estos intervalos (debido a break
). Los for
controles de bucle para ver qué partición r
es en
Ejemplo:.
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
Probablemente un buen candidato para http://stats.stackexchange.com/ – Chase