【问题标题】:How to manually set K-means cluster's centers?如何手动设置 K-means 聚类中心?
【发布时间】:2016-08-27 15:19:49
【问题描述】:

我不想预测中心,而是将每个对象分配给已经定义的中心。我该怎么办?

【问题讨论】:

  • 您的意思是要手动选择每个聚类“中心”并将每个点归类到最近的“中心”吗?
  • 是的,菲利普,我可能正在寻找错误的方法。新手在这里...
  • 我不知道 scikit-learn 是否这样做,但你可以很容易地自己实现。手动选择您的中心,为每个点计算距每个中心的距离,为每个点选择最近的中心,现在您已经分类了。
  • 在此处查看我的答案以在 python 中实现:gis.stackexchange.com/questions/412601/…

标签: python scikit-learn k-means


【解决方案1】:

您可能还想看看Scipy 中的KMeans 实现。参数minit 接受一个矩阵和

将 k 参数解释 [s] 为一个 k × M(或一维数据的长度为 k 数组)的初始质心数组。

【讨论】:

    【解决方案2】:

    一种方法是使用sklearn.cluster.KMeans 模块的n_initrandom_state 参数,如下所示:

    from sklearn.cluster import KMeans
    
    c = KMeans(n_init=1, random_state=1)
    

    这做了两件事: 1) random_state=1 将质心种子设置为 1。这与专门选择所需质心的坐标并不完全相同,但它确实允许您控制和复制种子。

    2) n_init=1 将迭代次数设置为 1,这意味着您会将集群尝试限制为仅在 random_state 步骤中选择的种子。

    您还可以使用n_clusters 参数选择要创建的质心数量。

    从这里开始,拟合和预测会将点分配给您预先建立的不同集群。

    【讨论】:

    • 但这并不能让我们控制质心的确切位置......对吗?这在这种情况下没有多大用处。
    【解决方案3】:

    您必须定义一个包含所需中心的数组(我们称之为 X),并在 kmean 算法中输入 'init= X' 看一下 sklearn 中的以下示例:

    class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')
    
    >>> from sklearn.cluster import KMeans
    >>> import numpy as np
    >>> X = np.array([[1, 2], [1, 4], [1, 0],
    ...               [10, 2], [10, 4], [10, 0]])
    >>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
    >>> kmeans.labels_
    array([1, 1, 1, 0, 0, 0], dtype=int32)
    >>> kmeans.predict([[0, 0], [12, 3]])
    array([1, 0], dtype=int32)
    >>> kmeans.cluster_centers_
    array([[10.,  2.],
           [ 1.,  2.]])
    

    更多信息: https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

    【讨论】:

      【解决方案4】:

      你可以fit你的KMeans到你想要的聚类中心,然后用这个模型来预测你的数据。

      from sklearn.cluster import KMeans
      
      cluster_centers = [[1, 1], [0, 0]]
      data  = [[1, 2], [1, 1], [3, 1], [10, -1]]
      
      kmeans = KMeans(n_clusters=2)
      kmeans.fit(cluster_centers)
      kmeans.cluster_centers_
      > array([[0., 0.],
               [1., 1.]])
      
      kmeans.predict(data)
      > array([1, 1, 1, 1])
      

      注意:n_clusters 必须与集群中心的数量相匹配

      【讨论】:

      • 其他答案告诉您如何设置初始质心/聚类中心。但是,除非数据与质心完全匹配,否则在拟合数据时会被覆盖。
      猜你喜欢
      • 2016-05-29
      • 2015-06-04
      • 2020-02-21
      • 2016-01-01
      • 2015-04-11
      • 2018-09-19
      • 1970-01-01
      • 2016-06-27
      • 2013-04-28
      相关资源
      最近更新 更多