在线熵评估算法

时间:2012-08-14 00:14:52

标签: solr lucene statistics real-time entropy

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

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

1 个答案:

答案 0 :(得分: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方法不存储流值这一事实。