微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Kmeans++ 算法中选择最优质心

如何解决在 Kmeans++ 算法中选择最优质心

我需要一些专业的帮助。我正在尝试使用 KMeans++ 那样的最佳质心选择来实现 KMeans 算法,但我有点卡在“选择初始质心”步骤中。我已经实现了该算法,但是选择了随机的初始质心。它看起来像这样:

def random_sample_float(n,mi,ma):
    return (ma - mi) * np.random.random_sample(n) + mi

def euclidian_distance_group(x,C):   
    return np.sqrt(np.sum(np.power(C-x,2),axis=1))

def KMeans_v2(K,Dx):
  # Selecting random centroids
  cDx = np.zeros(K*Dx.shape[1])
  cDx.shape = (K,Dx.shape[1])
  
  for d in np.arange(Dx.shape[1]):
    cDx[:,d] = random_sample_float(K,np.min(Dx[:,d]),np.max(Dx[:,d]))

  # Prediction for clusters
  Dyp = np.zeros(Dx.shape[0])

  iterating = True
  while iterating:
      cDx_ant = cDx.copy()

      for i in np.arange(Dx.shape[0]):
          distance_point_centroids = euclidian_distance_group(Dx[i],cDx)
          pred_y = np.argmin(distance_point_centroids)
          Dyp[i] = pred_y

      for k in range(K):
          cDx[k,:] = np.mean(Dx[Dyp == k],axis=0)
      
      iterating = (np.absolute(np.sum(cDx-cDx_ant)) > 0.00001)

  # Showing the clustering results
  fig2,ax = plt.subplots(figsize=(10,5))
  ax.scatter(Dx[:,0],Dx[:,1],c=Dyp)
  ax.scatter(cDx[:,cDx[:,marker='*',s=200,c='b')

正如您所看到的,质心是在数据集范围内随机选择的。现在,我想执行一个函数来选择更好的质心,如下所示:

  • 从数据点中随机均匀地选择一个中心。 对于每个数据点 x,计算 D(x),即 x 与已选择的最近中心之间的距离。
  • 随机选择一个新数据点作为新中心,使用加权概率分布,其中选择点 x 的概率与 D(x)^2 成正比(您可以使用 scipy.stats.rv_discrete ).
  • 重复第 2 步和第 3 步,直到选择了 k 个中心。
  • 既然已经选择了初始中心,请继续使用标准 k-means 聚类。

在这里有点迷茫,因为我真的不知道如何对每个点到每个质心的距离进行加权,并选择最佳质心(根据我猜测的最佳权重)。我只是试图测量所有点到第一个质心的距离,但我不知道我应该将这些距离与什么概率进行比较。 (如果有道理)

顺便说一下,我从类似的帖子中复制了选择最佳质心的步骤。真正的文档是 here(第 3 页)

其中步骤定义如下:

"" 让 D(x) 表示从数据点到我们已经选择的最近中心的最短距离:

  • 1a。取一个中心 c1,从 X 中随机均匀选择
  • 1b.取一个新的中心词,选择 x ∈ X 的概率为 D(x)^2 / ∑x∈X D(x)^2D(x)**2 / sum(D(x)**2)
  • 1c。重复步骤 1b。直到我们总共取了 k 个中心。
  • 按照标准 k-means 算法进行操作。

我们将步骤 1b 中使用的权重简称为“D2 权重”。 ""

如果有人能帮助我完成这个功能或更好地解释它,我将永远感激不尽。非常感谢您的帮助/建议

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。