首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R包可用于“调整后的相互信息”?

R包可用于“调整后的相互信息”?
EN

Stack Overflow用户
提问于 2014-02-17 22:42:46
回答 2查看 2K关注 0票数 1

我正在寻找一个包来计算两个聚类之间调整后的互信息。我只通过谷歌找到了一些python代码。是否有内置的R包或函数可以通过交互信息对数据进行聚类?

EN

回答 2

Stack Overflow用户

发布于 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。

代码语言:javascript
复制
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))   
}
票数 4
EN

Stack Overflow用户

发布于 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()函数。

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21831953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档