【问题标题】:Consistent K-Means Clustering Results一致的 K 均值聚类结果
【发布时间】:2015-03-16 07:36:47
【问题描述】:

我已阅读k-means: Same clusters for every execution

但这并不能解决我遇到的问题。我正在采样大小不同(大小增加)的数据。我需要使用 k-means 对数据进行聚类,但我遇到的问题是每个样本的聚类都不同。需要注意的重要一点是,我的t+1 示例将始终包含来自tth 示例的所有组件。所以它慢慢地变得越来越大。我需要的是一种能够使集群保持不变的方法。除了使用set.seeds 之外,还有其他方法吗?我愿意接受任何解决方案。

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为实现此目的的最佳方法是首先使用 k-means 对数据进行聚类,然后简单地将所有其他数据分配给最近的聚类(设置随机种子不会帮助您让新聚类嵌套在原来的范围内)。正如this question 的答案中所详述的,flexclust 包使这变得非常简单:

    # Split into "init" (used for initial clustering) and "later" (assigned later)
    set.seed(100)
    spl <- sample(nrow(iris), 0.5*nrow(iris))
    init <- iris[spl,-5]
    later <- iris[-spl,-5]
    
    # Build the initial k-means clusters with "init"
    library(flexclust)
    (km <- kcca(init, k=3, kccaFamily("kmeans")))
    # kcca object of family ‘kmeans’ 
    # 
    # call:
    # kcca(x = init, k = 3, family = kccaFamily("kmeans"))
    # 
    # cluster sizes:
    # 
    #  1  2  3 
    # 31 25 19 
    
    # Assign each element of "later" to the closest cluster
    head(predict(km, newdata=later))
    #  2  5  7  9 14 18 
    #  2  2  2  2  2  2 
    

    【讨论】:

    • 值得注意的是,这里是k-means,后面是k-nearest neighbor。一个警告是,如果目标是迭代地将新数据点分配给集群,则在每个添加的数据点之后重新计算质心可能更有意义。它看起来不像这样做。
    • @Jeff 不,这不会重新计算质心。然而,重新计算质心然后迭代地将点重新分配给最近的集群并不是 OP 想要的,因为 OP 希望原始集群分配嵌套在最终集群中。
    • @josliber 啊,我的意思是重新计算质心的意思。
    • 这太完美了!现在看看是否可以定期更新我的初始模型以合并新数据点以保持动态,这将是非常棒的。谢谢
    • @user1234440 这是我知道将原始作业嵌套在新作​​业中的唯一方法。如果您愿意更改原始分配,那么为什么不重新运行 k-means 聚类呢?
    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 2015-02-09
    • 2017-12-30
    • 2017-01-15
    • 2012-06-18
    • 2019-10-14
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多