【发布时间】:2017-02-27 05:15:11
【问题描述】:
我正在使用 dplyr 和 broom 为我的数据计算 kmeans。我的数据包含 X 和 Y 坐标的测试和训练集,并按某个参数值(在本例中为 lambda)分组:
mds.test = data.frame()
for(l in seq(0.1, 0.9, by=0.2)) {
new.dist <- run.distance.model(x, y, lambda=l)
mds <- preform.mds(new.dist, ndim=2)
mds.test <- rbind(mds.test, cbind(mds$space, design[,c(1,3,4,5)], lambda=rep(l, nrow(mds$space)), data="test"))
}
> head(mds.test)
Comp1 Comp2 Transcripts Genes Timepoint Run lambda data
7A_0_AAGCCTAGCGAC -0.06690476 -0.25519106 68125 9324 Day 0 7A 0.1 test
7A_0_AAATGACTGGCC -0.15292848 0.04310200 28443 6746 Day 0 7A 0.1 test
7A_0_CATCTCGTTCTA -0.12529445 0.13022908 27360 6318 Day 0 7A 0.1 test
7A_0_ACCGGCACATTC -0.33015913 0.14647857 23038 5709 Day 0 7A 0.1 test
7A_0_TATGTCGGAATG -0.25826098 0.05424976 22414 5878 Day 0 7A 0.1 test
7A_0_GAAAAAGGTGAT -0.24349387 0.08071162 21907 6766 Day 0 7A 0.1 test
我有head 上面的测试数据集,但我也有一个名为mds.train 的数据集,其中包含我的训练数据坐标。我的最终目标是对按 lambda 分组的两个集合运行 k-means,然后计算训练中心测试数据的 within.ss、between.ss 和 total.ss。感谢扫帚上的a great resource,我只需执行以下操作即可为测试集的每个 lambda 运行 kmeans:
test.kclusts = mds.test %>%
group_by(lambda) %>%
do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
然后我可以为每个 lambda 中的每个集群计算这些数据的中心:
test.clusters = test.kclusts %>%
group_by(lambda) %>%
do(tidy(.$kclust[[1]]))
这就是我卡住的地方。我如何计算与reference page(例如kclusts %>% group_by(k) %>% do(augment(.$kclust[[1]], points.matrix)))上类似显示的特征分配,其中我的points.matrix 是mds.test,它是一个data.frame,其中length(unique(mds.test$lambda)) 的行数是应有的行数?有没有办法以某种方式使用训练集中的中心来根据测试分配计算 glance() 统计数据?
任何帮助将不胜感激!谢谢!
编辑:更新进度。我已经弄清楚如何汇总测试/培训作业,但在尝试从两组计算 kmeans 统计数据时仍然遇到问题(测试中心的培训作业和培训中心的测试作业)。更新代码如下:
test.kclusts = mds.test %>% group_by(lambda) %>% do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
test.clusters = test.kclusts %>% group_by(lambda) %>% do(tidy(.$kclust[[1]]))
test.clusterings = test.kclusts %>% group_by(lambda) %>% do(glance(.$kclust[[1]]))
test.assignments = left_join(test.kclusts, mds.test) %>% group_by(lambda) %>% do(augment(.$kclust[[1]], cbind(.$Comp1, .$Comp2)))
train.kclusts = mds.train %>% group_by(lambda) %>% do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
train.clusters = train.kclusts %>% group_by(lambda) %>% do(tidy(.$kclust[[1]]))
train.clusterings = train.kclusts %>% group_by(lambda) %>% do(glance(.$kclust[[1]]))
train.assignments = left_join(train.kclusts, mds.train) %>% group_by(lambda) %>% do(augment(.$kclust[[1]], cbind(.$Comp1, .$Comp2)))
test.assignments$data = "test"
train.assignments$data = "train"
merge.assignments = rbind(test.assignments, train.assignments)
merge.assignments %>% filter(., data=='test') %>% group_by(lambda) ... ?
我在下面附上了一个图表,说明了我在这一点上的进展。重申一下,我想为训练数据中心的测试分配/坐标(中心看起来的图)计算 kmeans 统计量(在平方和内、总平方和之间以及在平方和之间):
【问题讨论】:
-
看起来有一些关于制作 tidymodels 配方或模型规范的讨论,例如recipes::step_kmeans() (请参阅此处的对话和此处的链接:github.com/tidymodels/embed/issues/77#issuecomment-801300749。但尚未完成。还有 widyr::widely_kmeans() 但这也不容易应用于测试集.