有没有一种方法可以评估类似于SumamryStatistics的离散值流上的熵的均值和偏差?我需要这个算法用于实时 solr 组件,它可能会迭代大型文档集合(100,000)。
相关问题,在类似 Map Reduce 的环境中计算熵的最佳方法是什么。
有没有一种方法可以评估类似于SumamryStatistics的离散值流上的熵的均值和偏差?我需要这个算法用于实时 solr 组件,它可能会迭代大型文档集合(100,000)。
相关问题,在类似 Map Reduce 的环境中计算熵的最佳方法是什么。
可能有一种方法 - 它在某种程度上取决于流的特征,以及您想要对结果做什么。
样本熵是样本概率分布的函数。您可以将每个值的运行计数与运行总计数一起存储,这意味着可以按需计算分布。原谅我草率的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
它与流中值的数量无关,从该方法不存储流值的事实可以看出。