不同大小样本的约束聚类

constrained clustering of samples of different size

我有 n 个大小为 s1、s2、...、sn 的样本,它们可能遵循也可能不遵循相同的分布。 我想将它们分成 K 组,其中 K >= 3
FYC 我主要从那里找到了一些想法:
https://stats.stackexchange.com/questions/223275/classification-of-samples-into-two-groups?rq=1

我选择了 conclust 包,它可能会解决我的问题,但问题是我的样本大小不同。所以调整他们的代码示例(https://rdrr.io/cran/conclust/man/ckmeans.html):

library(plyr)
library(conclust)

sample1 <- c(0, 0, 2)
sample2 <- c(1, 0, 3, 4, 2, 1)
sample3 <- c(1, 1)
sample4 <- c(0, 1, 6)

sample_list <- list(matrix(sample1, nrow = 1), matrix(sample2, nrow = 1), matrix(sample3, nrow = 1), matrix(sample4, nrow = 1))
data <- rbind.fill.matrix(sample_list)

mustLink = matrix(c(1, 2), nrow = 1)
cantLink = matrix(c(1, 4), nrow = 1)
k = 2
pred = ckmeans(data, k, mustLink, cantLink)
pred
Error in if (best == -1 || dd[j] < dd[best]) { : 
  missing value where TRUE/FALSE needed

我可以通过添加 data[is.na(data)] <- FALSE 轻松解决错误,但这感觉很奇怪,此时小样本会有很多 0 值并且即使不同也会聚集在一起,不是吗?

长话短说,请问在 R 中对不同大小的样本进行约束聚类的方法是什么?

你可以这样做:

  1. 定义样本之间的差异度量
  2. 计算差异矩阵
  3. 使用 k+tsp (https://www.jmlr.org/papers/volume7/climer06a/climer06a.pdf)

重要的是要注意,这里的样本会 'sequentially' 相似(每个簇都有顺序)。

样本差异性度量

sampleDistance <- function(s1, s2) mean(abs(outer(s1, s2, FUN = "-")))

差异矩阵

samples <- list(sample1, sample2, sample3, sample4)
n <- length(samples)

m <- matrix(0, nrow = n, ncol = n)
for(i in seq_len(n-1))
  m[i,(i+1):n] <- sapply(samples[(i+1):n], sampleDistance, s2 = samples[[i]])

m[lower.tri(m)] <- t(m)[lower.tri(m)]

k+tsp

library(TSP)

k <- 2 # number of clusters

cut_tour(
  solve_TSP(
    insert_dummy(TSP(m), n = k), 
    repetitions = n * 10, 
    two_opt = TRUE
  ),
  "dummy"
)

结果

$dummy
1 3 2 
1 3 2 

$dummy
4 
4