興味深い質問です。この論文に注目していただきありがとうございます-K-Means++:注意深いシードの利点
簡単に言うと、クラスターの中心は、入力された観測ベクトルのセットからランダムに最初に選択されます。以前に選択された中心の近くにないx
場合、ベクトルを選択する確率は高くなります。x
これが1次元の例です。私たちの観察は[0、1、2、3、4]です。最初の中心c1
、、を0とします。次のクラスター中心、、がxである確率は、c2
に比例し||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)です。
初期化手順を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]の間で均一に選択されるため、これらの間隔の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