不同大小样本的约束聚类
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 中对不同大小的样本进行约束聚类的方法是什么?
你可以这样做:
- 定义样本之间的差异度量
- 计算差异矩阵
- 使用 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
我有 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 中对不同大小的样本进行约束聚类的方法是什么?
你可以这样做:
- 定义样本之间的差异度量
- 计算差异矩阵
- 使用 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