确定聚类相似性/集合重叠
Determine cluster similarity / set overlap
我想做的是运行使用两个聚类算法(我们称它们为 A 和 B),然后比较结果(即算法对同一聚类中 80% 的模型进行分类)。一个包含 3 个模型的简单示例:
cl_A = c(1,2,1) #the result from Algorithm A
cl_B = c(2,1,2) #the result from Algorithm B
我希望从中得到什么解决方案?嗯,100%。为什么?因为我可以在脑海中“重命名”集群(将模型 B 的集群 1 重命名为 2,将集群 2 重命名为 1),然后发现集群完全相同。
换句话说,集群中的模型是相同的,这就是我们所关心的(我们不关心集群的“名称”,并且其中没有固有的顺序)。
这个例子怎么样?
cl_A = c(1,2,1,3)
cl_B = c(2,1,2,2)
(注意:向量的长度始终相同,但值可以在不同的范围内)
在这种情况下,我想得到 3/4 作为答案(即“重命名”cl_B 到 c(1,2,1,1) 然后说有 3 个元素 cl_A和 cl_B 是一样的。)
现在,我已经编写了一个函数,我手动检查了简单的示例(即上面的示例),但我不禁觉得对于更复杂的示例它不起作用...
如果你们中的任何人有想法和/或解决方案,请随时发表评论。
这是我的职责,但我会先解释一下我的工作:
我将“集群向量”(集群分配的向量)传递给它(上例中的 cl_A 和 cl_B)。然后我基本上遍历第一个向量的所有集群,并为第二个向量遍历所有集群并选择“最佳”重叠。因为我只想选择每个集群一次(即我不能说我将所有“1”重命名为“2”,但后来决定我也想将一些“1”重命名为“3” s(然后我总是会得到一个完美的契合))我保留了一个“taboo_list”。
这基本上就是它的全部内容。但是,感觉它并没有 100% 正确地工作,我希望能在这里找到一些帮助。已经谢谢了!
#' cluster similarity
#'
#' calculate how "similar" two methods / clusters are:
#' sum(kmeans_cluster_similarity(cluster1, cluster2))/length(cluster1)
#' is the % of objects that are in a cluster with the same objects as before
#'
#' @param cluster_vector_1 the first cluster object, as for example returned by knn()
#' @param cluster_vector_2 the second cluster object
#' @export
#'
cluster_similarity = function(cluster_vector_1, cluster_vector_2){
taboo_list_2 <<- rep(NA, length(unique(cluster_vector_1)))
overall_similarity <<- rep(NA, length(unique(cluster_vector_1)))
for(i in unique(cluster_vector_1)){
cl1 = which(cluster_vector_1 == i)
similarity <- rep(NA, length(unique(cluster_vector_1)))
for(j in unique(cluster_vector_2)){
if(!(j %in% taboo_list_2)){
cl2 = which(cluster_vector_2 == j)
similarity[j] <- sum(cl1 %in% cl2)
}
}
best_j <- which.max(similarity)
taboo_list_2[i] <<- best_j
overall_similarity[i] <<- max(similarity, na.rm = TRUE)
#print(overall_similarity)
}
#print(overall_similarity)
return(overall_similarity)
}
一个例子:
cl_A = c(1,2,1)
cl_B = c(2,1,2)
cluster_similarity(cl_A,cl_B)
有效。但我很确定其他一些东西不起作用...
编辑
关于我为什么这样做似乎有些困惑,所以让我试着澄清一下:我有数据(现在谁没有),我显然不能说确切的来源,但我想到一个很好的类比:想想几个 Kaggle 案例竞赛(称它们为 comp_A、comp_B、...)。
对于每场比赛,你有几个参与者提交了一些结果(分别称他们为 part_1,...part_n 和 inp_1,...,inp_n)。
现在显然不是所有参与者都会为每场比赛交出一些东西。比赛 A 可能有参赛者 1-20 的上交,而比赛 2 可能只有 1-10 和 20-25 的上交。
我想做的是找出哪些“参与者”是相似的。
例如,part_1 类似于 part_2 和 part_10,依此类推
没有任何验证集(甚至不是一个小验证集),每个“竞赛”大约有 20 名参与者,每名参与者有 1 个输入。这些输入是巨大的(好吧,每个 20MB,但加起来)
然后我的想法是对每个比赛的参与者(或者更确切地说,他们的输入)进行聚类,看看哪些参与者经常在同一个集群中(例如,如果 part_1 和 part_2 comp_A 和 comp_B 和 comp_C 在同一个集群中,也许它们是相似的)
好吧,我不知道使用一种聚类方法优于另一种聚类方法的任何理论依据,所以我让它们全部 运行 (并且没有验证集很难评估),现在想看看,正如@Logister 正确识别的那样,每个聚类算法的稳健性决定了哪个可能是最好的。
我希望这澄清了我的问题的背景,我总是乐于接受更具建设性的想法!
这是集群验证的话题。 R 中已经有函数可以在簇之间为您提供 "similarity" 的值,例如 Rand Index 和 Adjusted Rand Index。我建议你使用它们。
调整后的兰德指数是衡量集群之间一致性的最佳方法。
ARI measures not only the correct separation of elements belonging to a different classes, but also the relation between elements of the same class (
who said that )
可以找到ARI函数here。
ARI 背后的数学原理一点都不基础。因此,我建议您查看兰德指数测量,它非常易于理解并加以实施。
注意:当similarity
向量有几个最大值时,你的函数没有考虑。遇到这种情况怎么办?我建议你观看 this video
通常"comparing results"不同算法之间不是以它们之间的一致程度来做参考的。那么,如果算法达成一致呢?我建议退后一步,问问你想要完成什么。
通常重要的是您的聚类预测或识别其他现象的程度。例如。如果您尝试使用聚类进行某种分类,评估模型的一个好方法是查看 classification entropy.
我能想到为什么有人想要做你正在做的事情的唯一原因是检查集群是否 'robust'。如果这就是您要评估的内容,那么比较两种不同的算法不会让您达到想要的效果;你必须比较同类。我建议做一些 cross-validation/sub-sampling 检查相同的算法是否在不同的迭代中与自身一致。 R 应该有内置函数来为你做这件事。
我想做的是运行使用两个聚类算法(我们称它们为 A 和 B),然后比较结果(即算法对同一聚类中 80% 的模型进行分类)。一个包含 3 个模型的简单示例:
cl_A = c(1,2,1) #the result from Algorithm A
cl_B = c(2,1,2) #the result from Algorithm B
我希望从中得到什么解决方案?嗯,100%。为什么?因为我可以在脑海中“重命名”集群(将模型 B 的集群 1 重命名为 2,将集群 2 重命名为 1),然后发现集群完全相同。
换句话说,集群中的模型是相同的,这就是我们所关心的(我们不关心集群的“名称”,并且其中没有固有的顺序)。
这个例子怎么样?
cl_A = c(1,2,1,3)
cl_B = c(2,1,2,2)
(注意:向量的长度始终相同,但值可以在不同的范围内)
在这种情况下,我想得到 3/4 作为答案(即“重命名”cl_B 到 c(1,2,1,1) 然后说有 3 个元素 cl_A和 cl_B 是一样的。)
现在,我已经编写了一个函数,我手动检查了简单的示例(即上面的示例),但我不禁觉得对于更复杂的示例它不起作用...
如果你们中的任何人有想法和/或解决方案,请随时发表评论。
这是我的职责,但我会先解释一下我的工作:
我将“集群向量”(集群分配的向量)传递给它(上例中的 cl_A 和 cl_B)。然后我基本上遍历第一个向量的所有集群,并为第二个向量遍历所有集群并选择“最佳”重叠。因为我只想选择每个集群一次(即我不能说我将所有“1”重命名为“2”,但后来决定我也想将一些“1”重命名为“3” s(然后我总是会得到一个完美的契合))我保留了一个“taboo_list”。
这基本上就是它的全部内容。但是,感觉它并没有 100% 正确地工作,我希望能在这里找到一些帮助。已经谢谢了!
#' cluster similarity
#'
#' calculate how "similar" two methods / clusters are:
#' sum(kmeans_cluster_similarity(cluster1, cluster2))/length(cluster1)
#' is the % of objects that are in a cluster with the same objects as before
#'
#' @param cluster_vector_1 the first cluster object, as for example returned by knn()
#' @param cluster_vector_2 the second cluster object
#' @export
#'
cluster_similarity = function(cluster_vector_1, cluster_vector_2){
taboo_list_2 <<- rep(NA, length(unique(cluster_vector_1)))
overall_similarity <<- rep(NA, length(unique(cluster_vector_1)))
for(i in unique(cluster_vector_1)){
cl1 = which(cluster_vector_1 == i)
similarity <- rep(NA, length(unique(cluster_vector_1)))
for(j in unique(cluster_vector_2)){
if(!(j %in% taboo_list_2)){
cl2 = which(cluster_vector_2 == j)
similarity[j] <- sum(cl1 %in% cl2)
}
}
best_j <- which.max(similarity)
taboo_list_2[i] <<- best_j
overall_similarity[i] <<- max(similarity, na.rm = TRUE)
#print(overall_similarity)
}
#print(overall_similarity)
return(overall_similarity)
}
一个例子:
cl_A = c(1,2,1)
cl_B = c(2,1,2)
cluster_similarity(cl_A,cl_B)
有效。但我很确定其他一些东西不起作用...
编辑
关于我为什么这样做似乎有些困惑,所以让我试着澄清一下:我有数据(现在谁没有),我显然不能说确切的来源,但我想到一个很好的类比:想想几个 Kaggle 案例竞赛(称它们为 comp_A、comp_B、...)。
对于每场比赛,你有几个参与者提交了一些结果(分别称他们为 part_1,...part_n 和 inp_1,...,inp_n)。
现在显然不是所有参与者都会为每场比赛交出一些东西。比赛 A 可能有参赛者 1-20 的上交,而比赛 2 可能只有 1-10 和 20-25 的上交。
我想做的是找出哪些“参与者”是相似的。
例如,part_1 类似于 part_2 和 part_10,依此类推
没有任何验证集(甚至不是一个小验证集),每个“竞赛”大约有 20 名参与者,每名参与者有 1 个输入。这些输入是巨大的(好吧,每个 20MB,但加起来)
然后我的想法是对每个比赛的参与者(或者更确切地说,他们的输入)进行聚类,看看哪些参与者经常在同一个集群中(例如,如果 part_1 和 part_2 comp_A 和 comp_B 和 comp_C 在同一个集群中,也许它们是相似的)
好吧,我不知道使用一种聚类方法优于另一种聚类方法的任何理论依据,所以我让它们全部 运行 (并且没有验证集很难评估),现在想看看,正如@Logister 正确识别的那样,每个聚类算法的稳健性决定了哪个可能是最好的。
我希望这澄清了我的问题的背景,我总是乐于接受更具建设性的想法!
这是集群验证的话题。 R 中已经有函数可以在簇之间为您提供 "similarity" 的值,例如 Rand Index 和 Adjusted Rand Index。我建议你使用它们。
调整后的兰德指数是衡量集群之间一致性的最佳方法。
ARI measures not only the correct separation of elements belonging to a different classes, but also the relation between elements of the same class ( who said that )
可以找到ARI函数here。
ARI 背后的数学原理一点都不基础。因此,我建议您查看兰德指数测量,它非常易于理解并加以实施。
注意:当similarity
向量有几个最大值时,你的函数没有考虑。遇到这种情况怎么办?我建议你观看 this video
通常"comparing results"不同算法之间不是以它们之间的一致程度来做参考的。那么,如果算法达成一致呢?我建议退后一步,问问你想要完成什么。
通常重要的是您的聚类预测或识别其他现象的程度。例如。如果您尝试使用聚类进行某种分类,评估模型的一个好方法是查看 classification entropy.
我能想到为什么有人想要做你正在做的事情的唯一原因是检查集群是否 'robust'。如果这就是您要评估的内容,那么比较两种不同的算法不会让您达到想要的效果;你必须比较同类。我建议做一些 cross-validation/sub-sampling 检查相同的算法是否在不同的迭代中与自身一致。 R 应该有内置函数来为你做这件事。