public class RMSRecommenderEvaluatorModified extends AbstractKFoldRecommenderEvaluator { private RunningAverage average; @Override protected void reset() { average = new FullRunningAverage(); } @Override protected void processOneEstimate(float estimatedPreference, Preference realPref) { double diff = realPref.getValue() - estimatedPreference; average.addDatum(diff * diff); } @Override protected double computeFinalEvaluation() { return Math.sqrt(average.getAverage()); } @Override public String toString() { return "RMSRecommenderEvaluator"; }}
@Override public int getCount() { return delegate.getCount(); }
@Override public void removePreference(long userID, long itemID) throws TasteException { DataModel dataModel = getDataModel(); Float oldPref = dataModel.getPreferenceValue(userID, itemID); super.removePreference(userID, itemID); if (oldPref != null) { try { buildAveragesLock.writeLock().lock(); RunningAverage itemAverage = itemAverages.get(itemID); if (itemAverage == null) { throw new IllegalStateException("No preferences exist for item ID: " + itemID); } itemAverage.removeDatum(oldPref); RunningAverage userAverage = userAverages.get(userID); if (userAverage == null) { throw new IllegalStateException("No preferences exist for user ID: " + userID); } userAverage.removeDatum(oldPref); overallAveragePrefValue.removeDatum(oldPref); } finally { buildAveragesLock.writeLock().unlock(); } } }
assertEquals(0, runningAverage.getCount()); assertTrue(Double.isNaN(runningAverage.getAverage())); runningAverage.addDatum(1.0); assertEquals(1, runningAverage.getCount()); assertEquals(1.0, runningAverage.getAverage(), EPSILON); runningAverage.addDatum(1.0); assertEquals(2, runningAverage.getCount()); assertEquals(1.0, runningAverage.getAverage(), EPSILON); runningAverage.addDatum(4.0); assertEquals(3, runningAverage.getCount()); assertEquals(2.0, runningAverage.getAverage(), EPSILON); runningAverage.addDatum(-4.0); assertEquals(4, runningAverage.getCount()); assertEquals(0.5, runningAverage.getAverage(), EPSILON); runningAverage.removeDatum(-4.0); assertEquals(3, runningAverage.getCount()); assertEquals(2.0, runningAverage.getAverage(), EPSILON); runningAverage.removeDatum(4.0); assertEquals(2, runningAverage.getCount()); assertEquals(1.0, runningAverage.getAverage(), EPSILON); runningAverage.changeDatum(0.0); assertEquals(2, runningAverage.getCount()); assertEquals(1.0, runningAverage.getAverage(), EPSILON); runningAverage.changeDatum(2.0); assertEquals(2, runningAverage.getCount()); assertEquals(2.0, runningAverage.getAverage(), EPSILON);
@Override protected void processOneEstimate(float estimatedPreference, Preference realPref) { average.addDatum(Math.abs(realPref.getValue() - estimatedPreference)); }
@Override public void setPreference(long userID, long itemID, float value) throws TasteException { DataModel dataModel = getDataModel(); double prefDelta; try { Float oldPref = dataModel.getPreferenceValue(userID, itemID); prefDelta = oldPref == null ? value : value - oldPref; } catch (NoSuchUserException nsee) { prefDelta = value; } super.setPreference(userID, itemID, value); try { buildAveragesLock.writeLock().lock(); RunningAverage average = itemAverages.get(itemID); if (average == null) { RunningAverage newAverage = new FullRunningAverage(); newAverage.addDatum(prefDelta); itemAverages.put(itemID, newAverage); } else { average.changeDatum(prefDelta); } } finally { buildAveragesLock.writeLock().unlock(); } }
@Override protected double computeFinalEvaluation() { return average.getAverage(); }
@Test public void testCopyConstructor() { RunningAverage runningAverage = new FullRunningAverage(); runningAverage.addDatum(1.0); runningAverage.addDatum(1.0); assertEquals(2, runningAverage.getCount()); assertEquals(1.0, runningAverage.getAverage(), EPSILON); RunningAverage copy = new FullRunningAverage(runningAverage.getCount(), runningAverage.getAverage()); assertEquals(2, copy.getCount()); assertEquals(1.0, copy.getAverage(), EPSILON); }
@Test(expected = UnsupportedOperationException.class) public void testUnsupported2() { RunningAverage inverted = new InvertedRunningAverage(new FullRunningAverage()); inverted.changeDatum(1.0); }
@Override protected void processOneEstimate(float estimatedPreference, Preference realPref) { double diff = realPref.getValue() - estimatedPreference; average.addDatum(diff * diff); }
@Override public void setPreference(long userID, long itemID, float value) throws TasteException { DataModel dataModel = getDataModel(); double prefDelta; try { Float oldPref = dataModel.getPreferenceValue(userID, itemID); prefDelta = oldPref == null ? value : value - oldPref; } catch (NoSuchUserException nsee) { prefDelta = value; } super.setPreference(userID, itemID, value); try { buildAveragesLock.writeLock().lock(); RunningAverage average = itemAverages.get(itemID); if (average == null) { RunningAverage newAverage = new FullRunningAverage(); newAverage.addDatum(prefDelta); itemAverages.put(itemID, newAverage); } else { average.changeDatum(prefDelta); } } finally { buildAveragesLock.writeLock().unlock(); } }
@Override public double getAverage() { return -delegate.getAverage(); }
@Test public void testAverage() { RunningAverage avg = new FullRunningAverage(); RunningAverage inverted = new InvertedRunningAverage(avg); assertEquals(0, inverted.getCount()); avg.addDatum(1.0); assertEquals(1, inverted.getCount()); assertEquals(-1.0, inverted.getAverage(), EPSILON); avg.addDatum(2.0); assertEquals(2, inverted.getCount()); assertEquals(-1.5, inverted.getAverage(), EPSILON); }
@Test(expected = UnsupportedOperationException.class) public void testAndStdDevUnsupported2() { RunningAverage inverted = new InvertedRunningAverageAndStdDev(new FullRunningAverageAndStdDev()); inverted.changeDatum(1.0); }
protected double averateRating(long itemID) throws TasteException { PreferenceArray prefs = dataModel.getPreferencesForItem(itemID); RunningAverage avg = new FullRunningAverage(); for (Preference pref : prefs) { avg.addDatum(pref.getValue()); } return avg.getAverage(); } }
@Override protected void processOneEstimate(float estimatedPreference, Preference realPref) { double diff = realPref.getValue() - estimatedPreference; average.addDatum(diff * diff); }
@Override public void setPreference(long userID, long itemID, float value) throws TasteException { DataModel dataModel = getDataModel(); double prefDelta; try { Float oldPref = dataModel.getPreferenceValue(userID, itemID); prefDelta = oldPref == null ? value : value - oldPref; } catch (NoSuchUserException nsee) { prefDelta = value; } super.setPreference(userID, itemID, value); try { buildAveragesLock.writeLock().lock(); RunningAverage average = itemAverages.get(itemID); if (average == null) { RunningAverage newAverage = new FullRunningAverage(); newAverage.addDatum(prefDelta); itemAverages.put(itemID, newAverage); } else { average.changeDatum(prefDelta); } } finally { buildAveragesLock.writeLock().unlock(); } }
@Override protected double computeFinalEvaluation() { return average.getAverage(); }
@Override public void removePreference(long userID, long itemID) throws TasteException { DataModel dataModel = getDataModel(); Float oldPref = dataModel.getPreferenceValue(userID, itemID); super.removePreference(userID, itemID); if (oldPref != null) { try { buildAveragesLock.writeLock().lock(); RunningAverage itemAverage = itemAverages.get(itemID); if (itemAverage == null) { throw new IllegalStateException("No preferences exist for item ID: " + itemID); } itemAverage.removeDatum(oldPref); RunningAverage userAverage = userAverages.get(userID); if (userAverage == null) { throw new IllegalStateException("No preferences exist for user ID: " + userID); } userAverage.removeDatum(oldPref); overallAveragePrefValue.removeDatum(oldPref); } finally { buildAveragesLock.writeLock().unlock(); } } }
@Override public int getCount() { return delegate.getCount(); }