我使用这个k-means ++ python代码来初始化k个中心,但对于大数据来说它很长,例如400个2维点:
class KPlusPlus(KMeans):
def _dist_from_centers(self):
cent = self.mu
X = self.X
D2 = np.array([min([np.linalg.norm(x-c)**2 for c in cent]) for x in X])
self.D2 = D2
def _choose_next_center(self):
self.probs = self.D2/self.D2.sum()
self.cumprobs = self.probs.cumsum()
r = random.random()
ind = np.where(self.cumprobs >= r)[0][0]
return(self.X[ind])
def init_centers(self):
self.mu = random.sample(self.X, 1)
while len(self.mu) < self.K:
self._dist_from_centers()
self.mu.append(self._choose_next_center())
def plot_init_centers(self):
X = self.X
fig = plt.figure(figsize=(5,5))
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.plot(zip(*X)[0], zip(*X)[1], '.', alpha=0.5)
plt.plot(zip(*self.mu)[0], zip(*self.mu)[1], 'ro')
plt.savefig('kpp_init_N%s_K%s.png' % (str(self.N),str(self.K)), \
bbox_inches='tight', dpi=200)
有没有办法加速k-means ++?
答案 0 :(得分:1)
初始播种对k-means执行时间有很大影响。在this post中,您可以找到一些加快速度的策略。
也许,你可以考虑使用Siddhesh Khandelwal's K-means variant,这是在欧洲信息检索会议论文集(ECIR 2017)上公布的。 Siddhesh提供了python实现in GitHub,并伴随着其他一些先前的启发式算法。
答案 1 :(得分:1)
我还没有进行过任何实验,但可扩展的K-Means ++对于非常大的数据集来说似乎相当不错(对于那些甚至比你描述的更大的数据集)。 您可以找到论文here和另一篇解释它的帖子here。
不幸的是,我还没有看到任何代码,我相信......
答案 2 :(得分:0)
K-means ++初始化需要运行O(n * k)。这对于小k和大n来说相当快,但是如果你选择k太大,则需要一些时间。它与(慢)Lloyd变体的一次迭代一样昂贵,因此使用kmeans ++通常会得到回报。
你的实现更糟糕,至少是O(n *k²),因为它执行了不必要的重新计算。它可能总是选择与下一个中心相同的点。
请注意,您还只有初始化,而不是实际的kmeans。