Solr 在线熵评价算法

Solr 在线熵评价算法,solr,lucene,statistics,real-time,entropy,Solr,Lucene,Statistics,Real Time,Entropy,是否有一种方法可以对离散值流进行评估,类似于平均值和偏差? 我需要这个用于实时solr组件的算法,它可能会迭代大型文档集合(100000) 相关问题,在类似Map Reduce的环境中,计算熵的最佳方法是什么。可能有一种方法-它在某种程度上取决于流的特征,以及您希望对结果做什么 样本熵是样本概率分布的函数。您可以将每个值的运行计数与运行总计数一起存储,这意味着可以根据需要计算分布。请原谅我草率的Java,我写它已经有一年了 Map<K,Integer> runningCount =

是否有一种方法可以对离散值流进行评估,类似于平均值和偏差? 我需要这个用于实时solr组件的算法,它可能会迭代大型文档集合(100000)


相关问题,在类似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;
}
Map runningCount=new Map();
int totalCount=0;
公共无效附加值(K){
runningCount.insert(k,runningCount.get(k)+1);
总数+=1;
}
公共地图getDistribution(){
Map dist=新映射();
对于(K:runningCount.keys()){
dist.insert(k,runningCount.get(k)/totalCount);
}
返回距离;
}
这意味着您还可以根据需要计算熵:

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;
}
public-double-getEntropy(){
Map dist=getDistribution();
双熵=0;
对于(K:dist.keys()){
双p=dist.get(k);
熵-=p*Math.log(p);
}
返回熵;
}

这个算法是O(n)来计算分布和熵,其中n是流可能接受的值的数量。它独立于流中的值的数量,从
addValue
方法不存储流值这一事实可以看出。

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

样本熵是样本概率分布的函数。您可以将每个值的运行计数与运行总计数一起存储,这意味着可以根据需要计算分布。请原谅我草率的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;
}
Map runningCount=new Map();
int totalCount=0;
公共无效附加值(K){
runningCount.insert(k,runningCount.get(k)+1);
总数+=1;
}
公共地图getDistribution(){
Map dist=新映射();
对于(K:runningCount.keys()){
dist.insert(k,runningCount.get(k)/totalCount);
}
返回距离;
}
这意味着您还可以根据需要计算熵:

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;
}
public-double-getEntropy(){
Map dist=getDistribution();
双熵=0;
对于(K:dist.keys()){
双p=dist.get(k);
熵-=p*Math.log(p);
}
返回熵;
}

这个算法是O(n)来计算分布和熵,其中n是流可能接受的值的数量。它独立于流中的值的数量,从
addValue
方法不存储流值这一事实可以看出。

是的,您是对的,解决方案非常简单,我们可能可以切换到数组以提高性能。这对连续变量不起作用,但我不需要它。谢谢。是的,你是对的,解决方案非常简单,我们可能可以将映射切换到阵列以提高性能。这对连续变量不起作用,但我不需要它。谢谢