【问题标题】:Online entropy evaluation algorithm在线熵评估算法
【发布时间】:2012-08-14 00:14:52
【问题描述】:

有没有办法在类似于SumamryStatistics 的离散值流上评估entropy 的平均值和偏差? 我需要这个算法用于实时 solr 组件,它可能会遍历大型文档集合(100,000)。

相关问题,在类似 Map Reduce 的环境中计算熵的最佳方法是什么。

【问题讨论】:

    标签: solr lucene statistics real-time entropy


    【解决方案1】:

    可能有一种方法 - 它在某种程度上取决于流的特征,以及您想要对结果做什么。

    样本熵是样本概率分布的函数。您可以将每个值的运行计数与运行总计数一起存储,这意味着可以按需计算分布。请原谅我草率的 Java,我写它已经有一年了。

    Map<K,Integer> runningCount = new Map<K,Integer>();
    int totalCount = 0;
    
    public void addValue(K k) {
        runningCount.insert(k, runningCount.get(k) + 1);
        totalCount += 1;
    }
    
    public Map<K,Double> getDistribution() {
        Map<K,Double> dist = new Map<K,Double>();
        for (K k : runningCount.keys()) {
            dist.insert(k, runningCount.get(k) / totalCount);
        }
        return dist;
    }
    

    这意味着您还可以按需计算熵:

    public double getEntropy() {
        Map<K,Double> dist = getDistribution();
        double entropy = 0;
        for (K k : dist.keys()) {
            double p = dist.get(k);
            entropy -= p * Math.log(p);
        }
        return entropy;
    }
    

    这个算法是 O(n) 来计算分布和熵,其中 n 是您的流可能采用的值的数量。它与流中值的数量无关,从addValue 方法不存储流值这一事实可以看出。

    【讨论】:

    • 是的,你是对的,解决方案很简单,我们可能可以将 map 切换为 array 以提高性能。这不适用于连续变量,但我不需要这个。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2019-12-26
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多