围绕固定质心重新拟合集群

Posted

技术标签:

【中文标题】围绕固定质心重新拟合集群【英文标题】:Refitting clusters around fixed centroids 【发布时间】:2016-01-28 16:41:48 【问题描述】:

聚类/分类问题: 使用 k-means 聚类生成这些聚类和质心:

这是在初始运行中添加了集群属性的数据集:

  > dput(sampledata)
    structure(list(Player = structure(1:5, .Label = c("A", "B", "C", 
    "D", "E"), class = "factor"), Metric.1 = c(0.3938961, 0.28062338, 
    0.32532626, 0.29239642, 0.25622558), Metric.2 = c(0.00763359, 
    0.01172354, 0.40550867, 0.04026846, 0.05976367), Metric.3 = c(0.50766075, 
    0.20345662, 0.06267444, 0.08661417, 0.17588925), cluster = c(1L, 
    2L, 3L, 2L, 2L)), .Names = c("Player", "Metric.1", "Metric.2", 
    "Metric.3", "cluster"), row.names = c(NA, -5L), class = "data.frame")

这些是基于 3 个指标的集群详细信息:

> dput (scluster)
structure(list(cluster = c(1L, 2L, 3L, 2L, 2L), centers = structure(c(0.3938961, 
0.276415126666667, 0.32532626, 0.00763359, 0.03725189, 0.40550867, 
0.50766075, 0.155320013333333, 0.06267444), .Dim = c(3L, 3L), .Dimnames = list(
    c("1", "2", "3"), c("Metric.1", "Metric.2", "Metric.3"))), 
    totss = 0.252759813332907, withinss = c(0, 0.00930902482096013, 
    0), tot.withinss = 0.00930902482096013, betweenss = 0.243450788511947, 
    size = c(1L, 3L, 1L), iter = 1L, ifault = 0L), .Names = c("cluster", 
"centers", "totss", "withinss", "tot.withinss", "betweenss", 
"size", "iter", "ifault"), class = "kmeans")

Data with cluster attribute and centroids

我的目标是在每个集群的第一个集群运行后找到一种方法来修复这些质心,这样这些质心就可以用作固定的未来参考,以查看这些玩家如何进出这些集群并进入不同的集群,如果他们指标发生变化,从而跟踪它们的进步或退步。

具体来说,如果玩家 A 的指标发生变化,使得它现在类似于集群 2 而不是 1,基于到各自固定质心的欧几里德距离,我应该能够看到玩家 A 移动到集群 2。这意味着围绕从第一次运行获得的这些最初固定的质心重新拟合数据点。

这应该有助于用户了解如何处理此类数据挖掘问题。任何指针将不胜感激!谢谢。

【问题讨论】:

如果您使用来自您拥有的数据对象的dput 输出添加到您的问题,则可能有可能使用编码分析器。没有任何数据,这太模糊了,在此基础上存在关闭的严重风险。 (它已经获得了近距离投票,因此现在将在队列中对此类答案进行进一步审查。防止进一步近距离投票的方法是编辑问题正文以使其更加具体。) 我添加了一个与原始数据集相似的数据集以及集群和质心的输出。这行得通吗?很抱歉,我是 *** 的新手,但过去见过很多解决方案。请让我知道这是否可以。感谢您在这方面的时间。 这通常不会很有帮助,原因有两个:1)当您可以以文本格式提供数据输入时,人们并不真正期望进行数据输入,以及 2)它可能实际上是一个列表对象和列表的结构是需要的。如果你按照我的指示使用dput,我们只会得到结构。 @BondedDust 感谢您耐心地回复我并帮助我度过难关。现在帖子好点了吗?我全力以赴让它尽可能地友好。 【参考方案1】:

给你:

# install a couple of packages needed for the example
library(devtools)
devtools::install_github("alexwhitworth/emclustr")
devtools::install_github("alexwhitworth/imputation")
library(emclustr)
library(imputation)

# generate some example data -- 30 points in 3 2-dimensional clusters
# clusters are MVN
set.seed(123)
x <- rbind(gen_clust(10, 2, c(-5,5), c(1,1)),
           gen_clust(10, 2, c(0,0), c(1,1)),
           gen_clust(10, 2, c(5,5), c(1,1)))

# get initial centroids
km <- kmeans(x, centers= 3)$centers

# generate a new set of example data, in this case a "subsequent step"
# from your time-series
x2 <- rbind(gen_clust(10, 2, c(-4,-4), c(1,1)),
           gen_clust(10, 2, c(1,1), c(1,1)),
           gen_clust(10, 2, c(4,4), c(1,1)))

# calculate the Euclidean distance of each point to each centroid
# and evaluate nearest distance
d_km <- as.data.frame(cbind(dist_q.matrix(x= rbind(km[1,], x2), ref= 1L, q=2),
              dist_q.matrix(x= rbind(km[2,], x2), ref= 1L, q=2),
              dist_q.matrix(x= rbind(km[3,], x2), ref= 1L, q=2)))
names(d_km) <- c("dist_centroid1", "dist_centroid2", "dist_centroid3")
d_km$clust <- apply(d_km, 1, which.min)

# plot the centroids and the new points "x2" to show the results
plot(km, pch= 11, xlim= c(-6,6), ylim= c(-6,6))
points(x2, col= factor(d_km$clust))

【讨论】:

天哪,太棒了。谢谢亚历克斯。我将研究您的详细解决方案并回复您。我非常感谢你的时间和这样的细节。这太不可思议了

以上是关于围绕固定质心重新拟合集群的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何在python中使没有簇质心的簇不可见?

输入一个固定的簇质心,找到其他 N 个(python)

Sklearn:到每个集群的质心的平均距离

kmeans集群中节点和质心之间的距离?

如何使用seaborn专门绘制集群的质心?

scikit k-means:查找属于特定质心生成集群的数据点