我正在嘗試使用apache commons math來進行一組值的內核密度估計。一個bin碰巧只有一個值,當我嘗試調用cumulativeProbability()時,我得到一個NotStrictlyPositiveException。有什麼辦法可以防止這種情況發生?我不能確定所有垃圾箱至少有一個值。apache commons math - NotStrictlyPositiveException當bin中只有1個值時
謝謝。
我正在嘗試使用apache commons math來進行一組值的內核密度估計。一個bin碰巧只有一個值,當我嘗試調用cumulativeProbability()時,我得到一個NotStrictlyPositiveException。有什麼辦法可以防止這種情況發生?我不能確定所有垃圾箱至少有一個值。apache commons math - NotStrictlyPositiveException當bin中只有1個值時
謝謝。
鑑於此錯誤仍存在,我按照其指導原則編寫了我自己的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;
}
}
我得到了同樣的錯誤與我的發行版之一。
閱讀這個類的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();
現在我又遇到了另一個問題 - 在另一個數據集上調用cumulativeProbability時,我得到了一個Nan值。這個庫是否穩定? – barisdad
我得到了同樣的問題..它似乎是庫中的一個錯誤。找到了其他解決方案? – Alphaaa
我不記得了。對不起... – barisdad