2013-08-01 19 views
3

我正在嘗試使用apache commons math來進行一組值的內核密度估計。一個bin碰巧只有一個值,當我嘗試調用cumulativeProbability()時,我得到一個NotStrictlyPositiveException。有什麼辦法可以防止這種情況發生?我不能確定所有垃圾箱至少有一個值。apache commons math - NotStrictlyPositiveException當bin中只有1個值時

謝謝。

+0

現在我又遇到了另一個問題 - 在另一個數據集上調用cumulativeProbability時,我得到了一個N​​an值。這個庫是否穩定? – barisdad

+0

我得到了同樣的問題..它似乎是庫中的一個錯誤。找到了其他解決方案? – Alphaaa

+0

我不記得了。對不起... – barisdad

回答

0

鑑於此錯誤仍存在,我按照其指導原則編寫了我自己的EmpiricalDistribution class實現。 我只重新實現了我需要的功能,即計算分配的熵,但您可以輕鬆地將其擴展到您的需要。

public class EmpiricalDistribution { 

    private double[] values; 
    private int[] binCountArray; 
    private double maxValue, minValue; 
    private double mean, stDev; 

    public EmpiricalDistribution(double[] values) { 
     this.values = values; 
     int binCount = NumberUtil.roundToClosestInt(values.length/10.0); 
     binCountArray = new int[binCount]; 

     maxValue = Double.NEGATIVE_INFINITY; 
     minValue = Double.POSITIVE_INFINITY; 
     for (double value : values) { 
      if (value > maxValue) maxValue = value; 
      if (value < minValue) minValue = value; 
     } 

     double binRange = (maxValue - minValue)/binCount; 
     for (double value : values) { 
      int bin = (int) ((value - minValue)/binRange); 
      bin = Math.min(binCountArray.length - 1, bin); 
      binCountArray[bin]++; 
     } 

     mean = (new Mean()).evaluate(values); 
     stDev = (new StandardDeviation()).evaluate(values, mean); 
    } 

    public double getEntropy() { 
     double entropy = 0; 
     for (int valuesInBin : binCountArray) { 
      if (valuesInBin == 0) continue; 

      double binProbability = valuesInBin/(double) values.length; 
      entropy -= binProbability * FastMath.log(2, binProbability); 
     } 

     return entropy; 
    } 

    public double getMean() { 
     return mean; 
    } 

    public double getStandardDeviation() { 
     return stDev; 
    } 

} 
0

我得到了同樣的錯誤與我的發行版之一。

閱讀這個類的Javadoc中,它說以下內容:

USAGE NOTES: 
The binCount is set by default to 1000. A good rule of thumb 
is to set the bin count to approximately the length of the input 
file divided by 10. 

我初始化我的EmpiricalDistribution有binCount等於我最初的數據長度的10%,目前一切工作正常:

double[] baseLine = getBaseLineValues(); 
... 
// Initialise binCount 
distribution = new EmpiricalDistribution(baseLine.length/10); 
// Load base line data 
distribution.load(baseLine); 
// Now you can obtain random values based on this distribution 
double randomValue = distribution.getNextValue(); 
相關問題