是k-means ++适合大数据?

时间:2018-05-03 10:42:02

标签: python machine-learning bigdata cluster-analysis k-means

我使用这个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 ++?

3 个答案:

答案 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。