R/entropy.capa.ident.R

Defines functions entropy.capa.ident havrda.charvat.entropy renyi.entropy shannon.entropy shannon.function binary2subset

Documented in entropy.capa.ident

##############################################################################
#
# Copyright © 2005 Michel Grabisch and Ivan Kojadinovic    
#
# Ivan.Kojadinovic@polytech.univ-nantes.fr
#
# This software is a package for the statistical system GNU R:
# http://www.r-project.org 
#
# This software is governed by the CeCILL license under French law and
# abiding by the rules of distribution of free software.  You can  use, 
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info". 
#
# As a counterpart to the access to the source code and  rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty  and the software's author,  the holder of the
# economic rights,  and the successive licensors  have only  limited
# liability. 
#
# In this respect, the user's attention is drawn to the risks associated
# with loading,  using,  modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean  that it is complicated to manipulate,  and  that  also
# therefore means  that it is reserved for developers  and  experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or 
# data to be ensured and,  more generally, to use and operate it in the 
# same conditions as regards security. 
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license and that you accept its terms.
#
################################################################################

## Unsupervised capacity identification from data based on entropy measures

##############################################################################

## Internal functions

## Converts a subset represented as an integer (binary notation) 
## to a numeric
binary2subset <- function(n,b) {
    
    result <- .C("binary2subsetR", 
                 as.integer(n),
                 as.integer(b),
                 subset = integer(n), 
                 len = integer(1),
                 PACKAGE="kappalab")
    
    result$subset[1:result$len]
}

shannon.function <- function(x) {
    if (x > 0)
        return(-x * log(x))
    else
        return(0)
}

shannon.entropy <- function(f,...) {
    
    sum(sapply(f,shannon.function))
}

renyi.entropy <- function(f,alpha) {
    
    1/(1-alpha)*log(sum(f^alpha))
}

havrda.charvat.entropy <- function(f,beta) {
    
    1/(1-beta)*(sum(f^beta)-1)
}

##############################################################################

##Constructs a capacity from discretized profiles
## and using parametric entropy measures  

entropy.capa.ident <- function(d,entropy = "renyi",parameter = 1)
{
    if (!is.data.frame(d))
        stop("wrong arguments")
    
    n <- length(d)

    for(i in 1:n)
        if (!is.factor(d[[i]]))
            stop("wrong arguments")

    if (!(entropy %in% c("renyi","havrda.charvat")))
        stop("wrong arguments")	

    if (!(as.double(parameter) && length(parameter) == 1))
        stop("wrong arguments")	

    if (parameter == 1)
        entropy.measure <- shannon.entropy
    else if (entropy == "renyi")
        entropy.measure <- renyi.entropy
    else 
        entropy.measure <- havrda.charvat.entropy

    ## multidimensional contingency table
    t <- table(d)
    
    ## frequency table
    f <- t/sum(t)

    ## unsupervised capacity identification

    mu <- numeric(2^n)
    
    for (i in 2:2^n)
        mu[i] <- entropy.measure(margin.table(f,binary2subset(n,i-1)),
                                 parameter)

    subsets <-  .C("k_power_set", 
                   as.integer(n),
                   as.integer(n),
                   subsets = integer(2^n),
                   PACKAGE="kappalab")$subsets

    new("capacity", data = mu/mu[2^n], subsets = subsets, n = n)
}

#############################################################################

Try the kappalab package in your browser

Any scripts or data that you put into this service are public.

kappalab documentation built on Nov. 8, 2023, 1:07 a.m.