我正在寻找一个包来计算两个聚类之间调整后的互信息。我只通过谷歌找到了一些python代码。是否有内置的R包或函数可以通过交互信息对数据进行聚类?
发布于 2016-06-24 18:12:25
这是一个链接https://github.com/defleury/adjusted_mutual_information
它说“包含用于快速和并行计算R中聚类之间的调整互信息、归一化互信息(NMI)和调整兰德指数(ARI)的代码”。
对于小的集群,这里有3个函数。函数f_rez()接受2个向量作为输入,其中数字表示该元素的分区,并返回AMI。对于长度为N= 11.117的3对集群,在双核非平行的情况下,需要大约30s。
f_nij <- function(v1,v2,l1,l2){ #contingency table n(i,j)=t(i,j)
m <- matrix(0,l1,l2)
for (i in 1:length(v1)){
m[v1[i],v2[i]] <- m[v1[i],v2[i]] +1
}
m
}
f_emi <- function(s1,s2,l1,l2,n){ #expected mutual information
s_emi <- 0
for(i in 1:l1){
for (j in 1:l2){
min_nij <- max(1,s1[i]+s2[j]-n)
max_nij <- min(s1[i],s2[j])
n.ij <- seq(min_nij, max_nij) #sequence of consecutive numbers
t1<- (n.ij / n) * log((n.ij * n) / (s1[i]*s2[j]))
t2 <- exp(lfactorial(s1[i]) + lfactorial(s2[j]) + lfactorial(n - s1[i]) + lfactorial(n - s2[j]) - lfactorial(n) - lfactorial(n.ij) - lfactorial(s1[i] - n.ij) - lfactorial(s2[j] - n.ij) - lfactorial(n - s1[i] - s2[j] + n.ij))
emi <- sum(t1*t2)
s_emi <- s_emi + emi
}
}
return(s_emi)
}
f_rez <- function(v1,v2){
library(infotheo)
s1 <- tabulate(v1);
s2 <- tabulate(v2);
l1 <- length(s1)
l2 <- length(s2)
N <- length(v1)
tij <- f_nij(v1,v2,l1,l2) #contingency table n(i,j)=t(i,j). this would be equivalent with table(v1,v2)
mi <- mutinformation(v1,v2) #function for Mutual Information from package infotheo
h1 <- -sum(s1*log(s1/N))/N
h2 <- -sum(s2*log(s2/N))/N
nmi <- mi/max(h1,h2) # NMI Normalized MI
emi <- f_emi(s1,s2,l1,l2,N) # EMI Expected MI
ami <- (mi-emi)/max(h1,h2) #AMI Adjusted MI
return(c(nmi,ami))
}发布于 2015-05-02 21:32:23
我发现here是一个用于调整相互信息(AMI)的matlab代码。根据stackoverflow上的this线程,将.m文件转换成.r文件是可能的,虽然这不是一件容易的事情,但至少是一种为R。
R包“线索”提供了标准化的相互信息(NMI),这是AMI的一个“不太好”的版本。根据Nguyen Xuan Vinh和Julien Epps的论文“一种新的基于共识聚类的微阵列数据聚类数自动检测方法”,调整后的Rand Index(ARI)似乎是AMI的一个很好的替代品。
幸运是,有一些R包实现了这个功能,例如Phyclust包中的RRand()函数、flexclust包中的RandIndex()函数、mclust包中的adjustedRandIndex()函数以及clustergas包中的a.rand.index2()函数。
希望这能有所帮助。
https://stackoverflow.com/questions/21831953
复制相似问题