面试应用题:概率累加求熵

题目

给定一个整数序列,存放在数组xs中,长度为n,请计算该序列的熵。熵的计算方法:对于一个长度为n的序列xs,它包含m+1种不同的取值,s0,s1,…,sm,这些取值对应的出现概率分别为p0,p1,…,pm,则这个序列的熵为H(X)=-(p0log2(p0) + p1log2(p1) + … + pm*log2(pm)),其中,某个取值出现的概率p的计算方法为:这个取值出现的次数/长度n。

double entropy(int[] xs) {
        //遍历xs数组,把数值作为key,重复次数作为value,实例一个map
        Map<Integer, Double> map=new LinkedHashMap<Integer, Double>();
        int n = xs.length;
        Double Sum = 0.00;
        Double prob;
        //计算每个数字出现的次数,Map长度是m+1
        for (int i=0;i<n;i++){
            //如果map中包含这个key,则key的值+1
            if (map.containsKey(xs[i])){
                map.put(xs[i],map.get(xs[i])+1);
            }else{
                map.put(xs[i],1.00);
            }
        }
        //拿到map中所有key的集合,用于取值
        Object[] keys = map.keySet().toArray();
        //求熵
        for (int p=0;p < map.size();p++ ){
            //求P0 ~ Pm 每项概率
            prob = map.get(keys[p])/n;
            //做累加求熵
            Sum += prob * Math.log(prob)/Math.log(2);
        }
        return Sum*-1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值