У меня есть CSV-файл, содержащий около 9000 числовых последовательностей, которые мне нужно кластеризовать.Первые 6 строк CSV выглядят так:
id, sequence
"1","1 2"
"2","3 4 5 5 6 6 7 8 9 10 11 12 13 8 14 10 10 15 11 12 16"
"3","17 18 19 20 5 5 20 5 5"
"4","20 21"
"5","22 4 23 24 25 26"
Мой код R, который выполняет кластеризацию, выглядит следующим образом
seqsim <- function(seq1, seq2){
seq1 <- as.character(seq1)
seq2 <- as.character(seq2)
s1 <- get1grams(seq1)
s2 <- get1grams(seq2)
intersection <- intersect(s1,s2)
if(length(intersection)==0){
return (1)
}
else{
u <- union(s1, s2)
score = length(intersection)/length(u)
return (1-score)
}
}
###############
mydata <- read.csv("sequence.csv")
mydatamatrix <- as.matrix(mydata$sequence)
# take the data in csv and create dist matrix
rownames(mydatamatrix) <- mydata$id
distance_matrix <- dist_make(mydatamatrix, seqsim, "SeqSim (custom)")
clusters <- hclust(distance_matrix, method = "complete")
plot(clusters)
clusterCut <- cutree(clusters, h=0.5)
# clustercut contains the clusterIDs assigned to each sequence or row of the input dataset
# Number of members in each cluster
table(mydata$id,clusterCut)
write.csv(clusterCut, file = "clusterIDs.csv")
Код работает для небольшого числа последовательностей, например около 900, но явозникают проблемы с памятью для больших наборов данных.
Мой вопрос: правильно ли я делаю кластеризацию?Существуют ли более быстрые и эффективные способы обработки кластеризации данных такого типа с использованием R?Функция seqsim фактически возвращает расстояние, а не сходство, потому что я возвращаю 1-балл.Seqsim вызывает другие методы, которые я пропустил, чтобы уменьшить длину кода.