Ant*_*eev 38 language-agnostic algorithm cluster-analysis machine-learning k-means
我无法完全理解k-means ++算法.我很感兴趣的是如何挑选出第一个k质心(剩下的就像在原始的k-means中).
我将欣赏一步一步的解释和一个例子.维基百科中的那个还不够清楚.一个评论很好的源代码也会有所帮助.如果您使用的是6个阵列,那么请告诉我们哪个阵列是为了什么.
Ste*_*joa 64
有趣的问题.感谢您提醒我这篇论文.PDF链接原始论文.
简单来说,最初从输入观察向量集中随机选择聚类中心,其中x
如果x
不接近任何先前选择的中心,则选择向量的概率很高.
这是一个一维的例子.我们的观察结果是[0,1,2,3,4].设第一个中心c1
为0.下一个聚类中心c2
x 的概率与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).
我用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
Run Code Online (Sandbox Code Playgroud)
编辑澄清:输出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
Run Code Online (Sandbox Code Playgroud)
一线。
假设我们需要选择2个聚类中心,而不是像随机选择所有聚类中心一样(我们以简单的k均值进行选择),我们将随机选择第一个聚类中心,然后找到距离第一个中心最远的点{这些点很可能会不属于第一个聚类中心,因为它们离它很远},并在这些远点附近分配第二个聚类中心。