[关闭]
@EVA001 2017-12-12T15:26:57.000000Z 字数 2588 阅读 442

互信息条件互信息的计算

未分类


公式

image_1c0aedgrp408fi4nd1kie4dk9.png-41.4kB

互信息计算

协方差矩阵计算函数:

  1. getDoubleHang_value<-function(mylist1,mylist2){
  2. Dx1=var(mylist1)
  3. Dx2=var(mylist2)
  4. double_h_value=Dx1*Dx2-cov(mylist1,mylist2)*cov(mylist1,mylist2) // cov 计算C(X)
  5. }

计算整个互信息:

  1. for(xi in 1:nrow(z)){
  2. mylist_a<-as.double(c(z[xi,]))
  3. Dxa=var(mylist_a) //计算 行xi 的方差
  4. for(yi in 1:nrow(z)){
  5. mylist_b<-as.double(c(z[yi,]))
  6. Dxb=var(mylist_b) //计算 行yi 的方差
  7. cov_ab=getDoubleHang_value(mylist_a,mylist_b) //计算 MI(X,Y)
  8. mi=0.5*log(Dxa*Dxb/cov_ab) //套公式计算上图的公式(左边)
  9. mylist_info<-c(mylist_info,mi) //mylist_info 是最后的结果集
  10. }
  11. }

条件互信息计算

  1. info <- Info(Translat(graE[i]),Translat(graE[i+1]),Translat(brek),gene)

条件互信息的计算函数
输入:gxi源点;gyi入点;cutset割集;gen源数据矩阵
输出:CMI

  1. Info <- function(gxi,gyi,cutset,gen){
  2. cutset<-data.frame(cutset,stringsAsFactors = F)
  3. x<-c()
  4. y<-c()
  5. cutset_table<-data.frame()
  6. for(xi in 1:nrow(gen)){
  7. if(gxi==gen[xi,1]){
  8. x<-as.numeric(c(gen[xi,2:length(gen)]))
  9. }
  10. if(gyi==gen[xi,]){
  11. y<-as.numeric(gen[xi,2:length(gen)])
  12. }
  13. for(yi in 1:nrow(cutset)){
  14. if(gen[xi,1]==cutset[yi,1]){
  15. if(nrow(cutset_table)==0)
  16. cutset_table<-data.frame(t(gen[xi,]),stringsAsFactors = F)
  17. else
  18. cutset_table<-data.frame(cutset_table,t(gen[xi,]),stringsAsFactors = F)
  19. }
  20. }
  21. }
  22. cutset_table<-data.frame(t(cutset_table),stringsAsFactors = F)
  23. cutset_table<-cutset_table[,-1]
  24. to_list<-c()
  25. cut<-data.frame()
  26. for(xi in 1:nrow(cutset_table)){
  27. to_list<-as.numeric(c(cutset_table[xi,]))
  28. if(nrow(cut)==0)
  29. cut<-data.frame(to_list)
  30. else
  31. cut<-data.frame(cut,to_list)
  32. }
  33. // 上边计算完割集cut
  34. cut_x<-data.frame(cut,x)
  35. cut_y<-data.frame(cut,y)
  36. cut_x_y<-data.frame(cut,x,y)
  37. t=det(cov(cut_x))*det(cov(cut_y))/(det(cov(cut))*det(cov(cut_x_y))) // 套公式(图右)
  38. cmi=0.5*log(t)
  39. }

调用阶段

  1. for(i in seq(1,length(graE),2)){
  2. g_d <- g - edge(paste(graE[i],"|",graE[i+1],sep = ""))
  3. if( edge_connectivity(g_d, source = graE[i], target = graE[i+1], checks = TRUE) > 0){
  4. shortpa<-shortest_paths(g_d, from = graE[i], to = graE[i+1], mode = c("all"))$vpath
  5. one_path<-names(V(g))[as.integer(shortpa[[1]])]
  6. brek <- one_path[-c(1,length(one_path))]
  7. if(length(brek) > 0){
  8. info <- Info(Translat(graE[i]),Translat(graE[i+1]),Translat(brek),gene)
  9. // 条件互信息CMI 计算
  10. if(info < weight_3){ g <- g_d }
  11. }else{
  12. print(i)
  13. }
  14. }
  15. }

互信息计算的替换

  1. # 原先的核心逻辑
  2. for(xi in 1:nrow(z)){
  3. mylist_a<-as.double(c(z[xi,]))
  4. Dxa=var(mylist_a)
  5. for(yi in 1:nrow(z)){
  6. print(yi)
  7. #每次计算瞬间完成,主要归功于as.double(c(z[xi,])),整体计算
  8. mylist_b<-as.double(c(z[yi,]))
  9. Dxb=var(mylist_b)
  10. cov_ab=getDoubleHang_value(mylist_a,mylist_b)
  11. mi=0.5*log(Dxa*Dxb/cov_ab)
  12. mylist_info<-c(mylist_info,mi)
  13. }
  14. }
  15. # 现阶段是计算的元素,所以非常的慢
  16. for(xi in 1:ncol(data)){
  17. mylist_a<-data[,xi]
  18. for(yi in 1:ncol(data)){
  19. mylist_b<-data[,yi]
  20. mi <- myfunction3(mylist_a,mylist_b)
  21. mylist_info<-c(mylist_info,mi)
  22. }
  23. }

区别:
原先快,现在慢
原先的结果矩阵对角为Inf,现在的对角有值,即有(本身,本身)的互信息
原先的结果34/28正确,现在只替换互信息计算后45/18正确

条件互信息计算的替换

发生在三阶段的第二三阶段,原先都是先计算割集,然后将割集作为计算条件
现在直接更换公式,不计算割集

110/34正确

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注