【问题标题】:nstart for k-means in RR中k-means的nstart
【发布时间】:2020-08-23 12:03:43
【问题描述】:

许多地方的搜索结果报告说,R 的函数 kmeans 中的参数 nstart 设置了算法的多次迭代并选择“最佳迭代”,例如https://datascience.stackexchange.com/questions/11485/k-means-in-r-usage-of-nstart-parameter。任何人都可以提供任何关于它如何做到这一点的明确说明,即它以什么衡量标准定义得最好?

其次:R 的kmeans 函数接受一个参数centers。在这里,与 k-means 中的典型情况一样,可以在算法开始期望最大化之前初始化质心,方法是从数据集中选择初始质心行(数据点)。 (您也可以以矢量的形式提供数据集中不存在的点,付出更大的努力。在这种情况下,理论上您可以选择全局最优作为您的质心。这是 不是我所要求的。)当nstart或种子随机初始化初始化时,我很确定它是通过从您的数据集中随机选择质心并从那些(不仅仅是空间内的一组随机点)。

因此,总的来说,我正在寻找一种方法来从数据集中获得一组好的(例如,最好的 $n$ 试验,或最好的来自 nstart)的起始数据实例集 作为初始质心。有没有办法从nstart 中提取“获胜”(=最佳)初始质心集(然后我可以在将来的centers 参数中使用它)?任何其他简化和快速的方法来获得一组非常好的起始质心(大概,合理地接近集群中心最终的位置)?

也许至少有一种方法可以从给定的kmeans 运行中提取它选择从什么初始质心开始?

【问题讨论】:

    标签: r cluster-analysis k-means centroid


    【解决方案1】:

    kmeans 试图最小化的标准是内部散布矩阵的踪迹,即(不幸的是,本论坛不支持 LaTeX,但希望您仍然可以阅读):

    $$ trace(S_w) = \sum_{k=1}^K \sum{x \in C_k} ||x - \mu_k||^2 $$

    关于最佳起点:显然,“最佳”起点将是 kmeans 最终选择的聚类中心。这些在属性 centers 中返回:

    km <- kmeans(iris[,-5], 3)
    print(km$centers)
    

    如果您正在寻找最佳随机起点,您可以自己创建随机起点(使用 runif),执行此操作 nstart 次并评估哪个初始配置导致到最小的km$tot.withinss

    nstart <- 10
    K <- 3 # number of clusters
    D <- 4 # data point dimension
    
    # select possible range
    r.min <- apply(iris[,-5], MARGIN=2, FUN=min)
    r.max <- apply(iris[,-5], MARGIN=2, FUN=max)
    
    for (i in 1:nstart) {
      centers <- data.frame(runif(K, r.min[d], r.max[d]))
      for (d in 2:D) {
        centers <- cbind(centers, data.frame(runif(K, r.min[d], r.max[d])))
      }
      names(centers) <- names(iris[,-5])
    
      # call kmeans with centers and compare tot.withinss
      # ...
    }  
    

    【讨论】:

    • 谢谢!这很有帮助。所以nstart 将选择在散布矩阵中给出最佳轨迹的解决方案,我接受它。可以返回此跟踪的最终值吗?
    • 不幸的是,我不确定第二点是否真的回答了我的问题——我在问如何从 我的数据 中选择或找到一组好的起始中心初始化质心。 (因此,通过一个可以快速收敛到最佳解决方案的良好基准,我可以测量需要多少次迭代或算法之间的差异等。)当然,从最终质心开始会是矫枉过正,因为这样算法就不会了甚至需要运行,但我们可以假设这些质心不会与任何数据点完全相同。
    • @moebeus-zoom "能否返回这条轨迹的最终值?" 根据 kmeans 文档,许多 平方和(后缀 ss) 被返回。内散点矩阵的轨迹应该是tot.withinss.
    • 您的第二个问题不清楚:您所说的“一组好的起始中心”是什么意思?在蒙特卡罗方法中,它们是随机选择的。如果顺便说一句,这些随机选择是全局最小配置,那么这是一个很好的(实际上:非常最佳)起点,迭代次数最少(恰好是一次)。如果您想要更差的猜测,只需在 kmeans 返回的结果中添加噪声即可。
    • 让我在主帖中详细说明这一点——谢谢。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2018-04-05
    • 2018-02-10
    • 2017-08-18
    • 1970-01-01
    • 2020-08-27
    • 2013-02-07
    • 2015-05-29
    相关资源
    最近更新 更多