寻找相似的二进制序列
Finding Similar Binary Sequences
考虑以下数据集:
id = c(rep("aa", 3), rep("bb", 3), rep("cc", 3))
item = rep(c("run", "jump", "clap"), 3)
day = paste0('Day',1:5)
df = data.frame(id, item)
df[,day] <- c(rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5)
)
产生这个:
id item Day1 Day2 Day3 Day4 Day5
1 aa run 0 1 0 0 0
2 aa jump 0 1 0 1 0
3 aa clap 0 0 0 0 0
4 bb run 0 0 1 1 1
5 bb jump 1 1 0 1 1
6 bb clap 0 1 0 1 1
7 cc run 1 1 1 1 1
8 cc jump 0 1 1 1 1
9 cc clap 0 1 0 1 0
我想确定三个对象 (aa, bb, cc) 中哪一个在日常拍手、运行 和跳跃习惯方面具有相似的模式。
我在寻找某种聚类方法吗?我试过的一件事是把每个二进制序列分开,把它们变成5个字符串,然后排序。这提供了一个不错的视觉效果,但我正在寻找更多程序化和更少手动的东西。
有什么想法吗?谢谢!
您可以使用 cluster
包中的曼哈顿距离尝试 daisy
。
set.seed(1)
df[,day] <- c(rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5)
)
df
id item Day1 Day2 Day3 Day4 Day5
1 aa run 0 0 0 0 1
2 aa jump 0 0 1 1 0
3 aa clap 1 0 1 0 1
4 bb run 1 1 0 0 0
5 bb jump 0 0 1 1 1
6 bb clap 1 1 0 0 1
7 cc run 1 0 0 0 1
8 cc jump 1 1 0 1 1
9 cc clap 1 1 0 1 1
我们将通过运行、跳跃和拍手来比较三个科目。
require(cluster)
lapply(split(df, df$item), function(xx) {
xx <- data.frame(xx[, -c(1, 2)], row.names=xx$id)
daisy(xx, metric="manhattan")
})
$clap
Dissimilarities :
aa bb
bb 2
cc 3 1
Metric : manhattan
Number of objects : 3
$jump
Dissimilarities :
aa bb
bb 1
cc 4 3
Metric : manhattan
Number of objects : 3
$run
Dissimilarities :
aa bb
bb 3
cc 1 2
更高的成对数字意味着更不相似。例如,对 aa/bb for 运行 有数字 3,它是每一天的差异。
考虑以下数据集:
id = c(rep("aa", 3), rep("bb", 3), rep("cc", 3))
item = rep(c("run", "jump", "clap"), 3)
day = paste0('Day',1:5)
df = data.frame(id, item)
df[,day] <- c(rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5)
)
产生这个:
id item Day1 Day2 Day3 Day4 Day5
1 aa run 0 1 0 0 0
2 aa jump 0 1 0 1 0
3 aa clap 0 0 0 0 0
4 bb run 0 0 1 1 1
5 bb jump 1 1 0 1 1
6 bb clap 0 1 0 1 1
7 cc run 1 1 1 1 1
8 cc jump 0 1 1 1 1
9 cc clap 0 1 0 1 0
我想确定三个对象 (aa, bb, cc) 中哪一个在日常拍手、运行 和跳跃习惯方面具有相似的模式。
我在寻找某种聚类方法吗?我试过的一件事是把每个二进制序列分开,把它们变成5个字符串,然后排序。这提供了一个不错的视觉效果,但我正在寻找更多程序化和更少手动的东西。
有什么想法吗?谢谢!
您可以使用 cluster
包中的曼哈顿距离尝试 daisy
。
set.seed(1)
df[,day] <- c(rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5),
rbinom(5, 1, 0.5)
)
df
id item Day1 Day2 Day3 Day4 Day5
1 aa run 0 0 0 0 1
2 aa jump 0 0 1 1 0
3 aa clap 1 0 1 0 1
4 bb run 1 1 0 0 0
5 bb jump 0 0 1 1 1
6 bb clap 1 1 0 0 1
7 cc run 1 0 0 0 1
8 cc jump 1 1 0 1 1
9 cc clap 1 1 0 1 1
我们将通过运行、跳跃和拍手来比较三个科目。
require(cluster)
lapply(split(df, df$item), function(xx) {
xx <- data.frame(xx[, -c(1, 2)], row.names=xx$id)
daisy(xx, metric="manhattan")
})
$clap
Dissimilarities :
aa bb
bb 2
cc 3 1
Metric : manhattan
Number of objects : 3
$jump
Dissimilarities :
aa bb
bb 1
cc 4 3
Metric : manhattan
Number of objects : 3
$run
Dissimilarities :
aa bb
bb 3
cc 1 2
更高的成对数字意味着更不相似。例如,对 aa/bb for 运行 有数字 3,它是每一天的差异。