代码之家  ›  专栏  ›  技术社区  ›  cnauber

如何推广R中交叉熵的计算?

r
  •  1
  • cnauber  · 技术社区  · 4 年前

    参考文章: http://dx.doi.org/10.2139/ssrn.3560339

    我有这个:

    data.frame(v1=c(0,0,9,4,0), v2=c(0,6,0,4,3), v3=c(3,0,0,0,4))-> res
    
    cross.entropy<-function(x){ 
        prob.d1<-function(x,i) x[i]/colSums(x)[i]
        prob.d2<-function(x,i,j) x[,c(i,j)]/colSums(x[,c(i,j)]) %>% sum() #IF v2
        prob.d3<-function(x,i,j,k) x[,c(i,j,k)]/colSums(x[,c(i,j,k)]) %>% sum() #IF v3
        prob.d4<-function(x,i,j,k,l) x[,c(i,j,k,l)]/colSums(x[,c(i,j,k,l)]) %>% sum() #IF v4
    
        H1 <- prob.d1(x,1)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2)
        H2 <- prob.d1(x,2)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2)
        H3 <- prob.d1(x,3)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2)
        H4 <- prob.d1(x,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2)
        T1 <- H1-(H2+H3+H4)
        T2 <- H2-(H1+H3+H4)#IF v2
        T3 <- H3-(H1+H2+H4)#IF v3
        T4 <- H4-(H1+H2+H3)#IF v4
        
        H12 <- prob.d2(x,1,2)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T12 <- (H1+H2)-H12#IF v2
        H13 <- prob.d2(x,1,3)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T13 <- (H1+H3)-H13#IF v3
        H14 <- prob.d2(x,1,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T14 <- (H1+H4)-H14#IF v4
        H23 <- prob.d2(x,2,3)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T23 <- (H2+H3)-H23#IF v3, v4
        H24 <- prob.d2(x,2,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T24 <- (H2+H4)-H24#IF v4
        H34 <- prob.d2(x,3,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T34 <- (H3+H4)-H34#IF v4
        
        H123 <- prob.d3(x,1,2,3)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T123 <- (H1+H2+H3)-(H12+H13+H23)+H123#IF v3, v4
        H124 <- prob.d3(x,1,2,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T124 <- (H1+H2+H4)-(H12+H14+H24)+H124#IF v4
        H134 <- prob.d3(x,1,3,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T134 <- (H1+H3+H4)-(H13+H14+H34)+H134#IF v4
        H234 <- prob.d3(x,2,3,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T234 <- (H2+H3+H4)-(H23+H24+H34)+H234#IF v4
        
        H1234 <- prob.d4(x,1,2,3,4)%>% round(2) %>% as.matrix( ) %>% entropia() %>% round(2);T1234 <- (H2+H3+H4)-(H23+H24+H34)+H234#IF v4
    
        return(data.frame(H1 = H1, T1 = T1, H2 = H2, T2 = T2, H3 = H3, T3 = T3, H4 = H4, T4 = T4, H12 = H12, T12 = T12, H13 = H13, T13 = T13, H14 = H14, T14 = T14, H23 = H23, T23 = T23, H24 = H24, T24 = T24, H34 = H34, T34 = T34, H123 = H123, T123 = T123, H124 = H124, T124 = T124, H134 = H134, T134 = T134, H234 = H234, T234 = T234, H1234 = H1234, T1234 = T1234))
    }
    cross.entropy(res)
    

    如何将该函数推广到具有n个向量的矩阵>1.

    示例:

    数据帧(v1=c(0,0,9,4,0),v2=c(,6,0,4,3))->;resV2

    数据帧(v1=c(0,0,9,4,0),v2=c(,6,0,4,3),v3=c(3,0,0,4),v4=c(4,3,5,0))->;resV4

    数据帧(v1=c(?,?,?),。。。,vn=c(?,?,?)->;resVn

    0 回复  |  直到 4 年前