@Override public synchronized String toString() { return String.valueOf(String.valueOf(getAverage()) + ',' + stdDev); }
@Override public synchronized void removeDatum(double datum) { int oldCount = getCount(); super.removeDatum(datum); double oldmk = mk; mk = (oldCount * oldmk - datum) / (oldCount - 1); sk -= (datum - mk) * (datum - oldmk); recomputeStdDev(); }
/** * Standard deviation of normalized producer accuracy * Not a standard score * @return double */ public RunningAverageAndStdDev getNormalizedStats() { RunningAverageAndStdDev summer = new FullRunningAverageAndStdDev(); for (int d = 0; d < confusionMatrix.length; d++) { double total = 0; for (int j = 0; j < confusionMatrix.length; j++) { total += confusionMatrix[d][j]; } summer.addDatum(confusionMatrix[d][d] / (total + 0.000001)); } return summer; }
public FullRunningAverageAndStdDev(int count, double average, double mk, double sk) { super(count, average); this.mk = mk; this.sk = sk; recomputeStdDev(); }
private synchronized void recomputeStdDev() { int count = getCount(); stdDev = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN; }
/** * Standard deviation of normalized producer accuracy * Not a standard score * @return double */ public RunningAverageAndStdDev getNormalizedStats() { RunningAverageAndStdDev summer = new FullRunningAverageAndStdDev(); for (int d = 0; d < confusionMatrix.length; d++) { double total = 0; for (int j = 0; j < confusionMatrix.length; j++) { total += confusionMatrix[d][j]; } summer.addDatum(confusionMatrix[d][d] / (total + 0.000001)); } return summer; }
public FullRunningAverageAndStdDev() { mk = 0.0; sk = 0.0; recomputeStdDev(); }
private synchronized void recomputeStdDev() { int count = getCount(); stdDev = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN; }
/** * Standard deviation of normalized producer accuracy * Not a standard score * @return double */ public RunningAverageAndStdDev getNormalizedStats() { RunningAverageAndStdDev summer = new FullRunningAverageAndStdDev(); for (int d = 0; d < confusionMatrix.length; d++) { double total = 0; for (int j = 0; j < confusionMatrix.length; j++) { total += confusionMatrix[d][j]; } summer.addDatum(confusionMatrix[d][d] / (total + 0.000001)); } return summer; }
@Override public synchronized void removeDatum(double datum) { int oldCount = getCount(); super.removeDatum(datum); double oldmk = mk; mk = (oldCount * oldmk - datum) / (oldCount - 1); sk -= (datum - mk) * (datum - oldmk); recomputeStdDev(); }
public FullRunningAverageAndStdDev(int count, double average, double mk, double sk) { super(count, average); this.mk = mk; this.sk = sk; recomputeStdDev(); }
@Override public synchronized String toString() { return String.valueOf(String.valueOf(getAverage()) + ',' + stdDev); }
private synchronized void recomputeStdDev() { int count = getCount(); stdDev = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN; }
private double getEvaluation(FastByIDMap<PreferenceArray> testPrefs, Recommender recommender) throws TasteException { reset(); Collection<Callable<Void>> estimateCallables = new ArrayList<>(); AtomicInteger noEstimateCounter = new AtomicInteger(); for (Map.Entry<Long,PreferenceArray> entry : testPrefs.entrySet()) { estimateCallables.add( new PreferenceEstimateCallable(recommender, entry.getKey(), entry.getValue(), noEstimateCounter)); } log.info("Beginning evaluation of {} users", estimateCallables.size()); RunningAverageAndStdDev timing = new FullRunningAverageAndStdDev(); execute(estimateCallables, noEstimateCounter, timing); return computeFinalEvaluation(); }
@Override public synchronized void removeDatum(double datum) { int oldCount = getCount(); super.removeDatum(datum); double oldmk = mk; mk = (oldCount * oldmk - datum) / (oldCount - 1); sk -= (datum - mk) * (datum - oldmk); recomputeStdDev(); }
public FullRunningAverageAndStdDev() { mk = 0.0; sk = 0.0; recomputeStdDev(); }
@Override public synchronized String toString() { return String.valueOf(String.valueOf(getAverage()) + ',' + stdDev); }
private double getEvaluation(FastByIDMap<PreferenceArray> testPrefs, Recommender recommender) throws TasteException { reset(); Collection<Callable<Void>> estimateCallables = Lists.newArrayList(); AtomicInteger noEstimateCounter = new AtomicInteger(); for (Map.Entry<Long,PreferenceArray> entry : testPrefs.entrySet()) { estimateCallables.add( new PreferenceEstimateCallable(recommender, entry.getKey(), entry.getValue(), noEstimateCounter)); } log.info("Beginning evaluation of {} users", estimateCallables.size()); RunningAverageAndStdDev timing = new FullRunningAverageAndStdDev(); execute(estimateCallables, noEstimateCounter, timing); return computeFinalEvaluation(); }
@Override public synchronized void addDatum(double datum) { super.addDatum(datum); int count = getCount(); if (count == 1) { mk = datum; sk = 0.0; } else { double oldmk = mk; double diff = datum - oldmk; mk += diff / count; sk += diff * (datum - mk); } recomputeStdDev(); }
public FullRunningAverageAndStdDev(int count, double average, double mk, double sk) { super(count, average); this.mk = mk; this.sk = sk; recomputeStdDev(); }