private static PreferenceArray cloneAndMergeInto(PreferenceArray delegatePrefs, long itemID, long newUserID, float value) { int num4; int num = (delegatePrefs == null) ? 0 : delegatePrefs.length(); int size = num + 1; PreferenceArray array = new GenericItemPreferenceArray(size); array.setItemID(0, itemID); int i = 0; while ((i < num) && (newUserID > delegatePrefs.getUserID(i))) { i++; } for (num4 = 0; num4 < i; num4++) { array.setUserID(num4, delegatePrefs.getUserID(num4)); array.setValue(num4, delegatePrefs.getValue(num4)); } array.setUserID(i, newUserID); array.setValue(i, value); for (num4 = i + 1; num4 < size; num4++) { array.setUserID(num4, delegatePrefs.getUserID(num4 - 1)); array.setValue(num4, delegatePrefs.getValue(num4 - 1)); } return(array); }
private float doEstimatePreference(long userID, long itemID) { double count = 0.0; double totalPreference = 0.0; PreferenceArray prefs = getDataModel().getPreferencesFromUser(userID); RunningAverage[] averages = diffStorage.getDiffs(userID, itemID, prefs); int size = prefs.length(); for (int i = 0; i < size; i++) { RunningAverage averageDiff = averages[i]; if (averageDiff != null) { double averageDiffValue = averageDiff.getAverage(); if (weighted) { double weight = averageDiff.getCount(); if (stdDevWeighted) { var raaStdDev = averageDiff as RunningAverageAndStdDev; if (raaStdDev != null) { double stdev = raaStdDev.getStandardDeviation(); if (!Double.IsNaN(stdev)) { weight /= 1.0 + stdev; } } // If stdev is NaN, then it is because count is 1. Because we're weighting by count, // the weight is already relatively low. We effectively assume stdev is 0.0 here and // that is reasonable enough. Otherwise, dividing by NaN would yield a weight of NaN // and disqualify this pref entirely // (Thanks Daemmon) } totalPreference += weight * (prefs.getValue(i) + averageDiffValue); count += weight; } else { totalPreference += prefs.getValue(i) + averageDiffValue; count += 1.0; } } } if (count <= 0.0) { RunningAverage itemAverage = diffStorage.getAverageItemPref(itemID); return(itemAverage == null ? float.NaN : (float)itemAverage.getAverage()); } else { return((float)(totalPreference / count)); } }
protected virtual float doEstimatePreference(long userID, PreferenceArray preferencesFromUser, long itemID) { double num = 0.0; double num2 = 0.0; int num3 = 0; double[] numArray = this.similarity.itemSimilarities(itemID, preferencesFromUser.getIDs()); for (int i = 0; i < numArray.Length; i++) { double d = numArray[i]; if (!double.IsNaN(d)) { num += d * preferencesFromUser.getValue(i); num2 += d; num3++; } } if (num3 <= 1) { return(float.NaN); } float estimate = (float)(num / num2); if (this.capper != null) { estimate = this.capper.capEstimate(estimate); } return(estimate); }
public void removeItemPref(long userID, long itemIDA, float prefValue) { PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID); try { buildAverageDiffsLock.EnterWriteLock(); FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA); int length = userPreferences.length(); for (int i = 0; i < length; i++) { long itemIDB = userPreferences.getItemID(i); float bValue = userPreferences.getValue(i); if (itemIDA < itemIDB) { if (aMap != null) { RunningAverage average = aMap.get(itemIDB); if (average != null) { if (average.getCount() <= 1) { aMap.remove(itemIDB); } else { average.removeDatum(bValue - prefValue); } } } } else if (itemIDA > itemIDB) { FastByIDMap <RunningAverage> bMap = averageDiffs.get(itemIDB); if (bMap != null) { RunningAverage average = bMap.get(itemIDA); if (average != null) { if (average.getCount() <= 1) { aMap.remove(itemIDA); } else { average.removeDatum(prefValue - bValue); } } } } } } finally { buildAverageDiffsLock.ExitWriteLock(); } }
public RandomRecommender(DataModel dataModel) : base(dataModel) { this.random = RandomUtils.getRandom(); float negativeInfinity = float.NegativeInfinity; float positiveInfinity = float.PositiveInfinity; IEnumerator <long> enumerator = dataModel.getUserIDs(); while (enumerator.MoveNext()) { long current = enumerator.Current; PreferenceArray array = dataModel.getPreferencesFromUser(current); for (int i = 0; i < array.length(); i++) { float num5 = array.getValue(i); if (num5 < positiveInfinity) { positiveInfinity = num5; } if (num5 > negativeInfinity) { negativeInfinity = num5; } } } this.minPref = positiveInfinity; this.maxPref = negativeInfinity; }
private long processOneUser(long averageCount, long userID) { log.debug("Processing prefs for user {}", userID); // Save off prefs for the life of this loop iteration PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID); int length = userPreferences.length(); for (int i = 0; i < length - 1; i++) { float prefAValue = userPreferences.getValue(i); long itemIDA = userPreferences.getItemID(i); FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA); if (aMap == null) { aMap = new FastByIDMap <RunningAverage>(); averageDiffs.put(itemIDA, aMap); } for (int j = i + 1; j < length; j++) { // This is a performance-critical block long itemIDB = userPreferences.getItemID(j); RunningAverage average = aMap.get(itemIDB); if (average == null && averageCount < maxEntries) { average = buildRunningAverage(); aMap.put(itemIDB, average); averageCount++; } if (average != null) { average.addDatum(userPreferences.getValue(j) - prefAValue); } } RunningAverage itemAverage = averageItemPref.get(itemIDA); if (itemAverage == null) { itemAverage = buildRunningAverage(); averageItemPref.put(itemIDA, itemAverage); } itemAverage.addDatum(prefAValue); } return(averageCount); }
public void addItemPref(long userID, long itemIDA, float prefValue) { PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID); try { buildAverageDiffsLock.EnterWriteLock(); FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA); if (aMap == null) { aMap = new FastByIDMap <RunningAverage>(); averageDiffs.put(itemIDA, aMap); } int length = userPreferences.length(); for (int i = 0; i < length; i++) { long itemIDB = userPreferences.getItemID(i); float bValue = userPreferences.getValue(i); if (itemIDA < itemIDB) { RunningAverage average = aMap.get(itemIDB); if (average == null) { average = buildRunningAverage(); aMap.put(itemIDB, average); } average.addDatum(bValue - prefValue); } else { FastByIDMap <RunningAverage> bMap = averageDiffs.get(itemIDB); if (bMap == null) { bMap = new FastByIDMap <RunningAverage>(); averageDiffs.put(itemIDB, bMap); } RunningAverage average = bMap.get(itemIDA); if (average == null) { average = buildRunningAverage(); bMap.put(itemIDA, average); } average.addDatum(prefValue - bValue); } } } finally { buildAverageDiffsLock.ExitWriteLock(); } }
private static float?getPreferenceForItem(PreferenceArray preferencesFromUser, long itemID) { int num = preferencesFromUser.length(); for (int i = 0; i < num; i++) { if (preferencesFromUser.getItemID(i) == itemID) { return(new float?(preferencesFromUser.getValue(i))); } } return(null); }
public override float?getPreferenceValue(long userID, long itemID) { PreferenceArray array = this.getPreferencesFromUser(userID); int num = array.length(); for (int i = 0; i < num; i++) { if (array.getItemID(i) == itemID) { return(new float?(array.getValue(i))); } } return(null); }
private static double computeThreshold(PreferenceArray prefs) { if (prefs.length() < 2) { return(double.NegativeInfinity); } RunningAverageAndStdDev dev = new FullRunningAverageAndStdDev(); int num = prefs.length(); for (int i = 0; i < num; i++) { dev.addDatum((double)prefs.getValue(i)); } return(dev.getAverage() + dev.getStandardDeviation()); }
public FastIDSet getRelevantItemsIDs(long userID, int at, double relevanceThreshold, DataModel dataModel) { PreferenceArray array = dataModel.getPreferencesFromUser(userID); FastIDSet set = new FastIDSet(at); array.sortByValueReversed(); for (int i = 0; (i < array.length()) && (set.size() < at); i++) { if (array.getValue(i) >= relevanceThreshold) { set.add(array.getItemID(i)); } } return(set); }
public override float?getPreferenceValue(long userID, long itemID) { if (this.isAnonymousUser(userID)) { PreferenceArray array = this.tempPrefs[userID]; for (int i = 0; i < array.length(); i++) { if (array.getItemID(i) == itemID) { return(new float?(array.getValue(i))); } } return(null); } return(base.getDelegate().getPreferenceValue(userID, itemID)); }
public float get(long key) { PreferenceArray array = this.inf.dataModel.getPreferencesFromUser(key); int num = array.length(); if (num == 0) { return(AveragingPreferenceInferrer.ZERO); } RunningAverage average = new FullRunningAverage(); for (int i = 0; i < num; i++) { average.addDatum((double)array.getValue(i)); } return((float)average.getAverage()); }
private void buildAverageDiffs() { lock (this) { DataModel model = this.getDataModel(); IEnumerator <long> enumerator = model.getUserIDs(); while (enumerator.MoveNext()) { long current = enumerator.Current; PreferenceArray array = model.getPreferencesFromUser(current); int num2 = array.length(); for (int i = 0; i < num2; i++) { long itemID = array.getItemID(i); float num5 = array.getValue(i); addDatumAndCreateIfNeeded(itemID, num5, this.itemAverages); addDatumAndCreateIfNeeded(current, num5, this.userAverages); this.overallAveragePrefValue.addDatum((double)num5); } } } }
private void splitOneUsersPrefs(double trainingPercentage, FastByIDMap <PreferenceArray> trainingPrefs, FastByIDMap <PreferenceArray> testPrefs, long userID, DataModel dataModel) { List <Preference> prefs = null; List <Preference> list2 = null; PreferenceArray array = dataModel.getPreferencesFromUser(userID); int num = array.length(); for (int i = 0; i < num; i++) { Preference item = new GenericPreference(userID, array.getItemID(i), array.getValue(i)); if (this.random.nextDouble() < trainingPercentage) { if (prefs == null) { prefs = new List <Preference>(3); } prefs.Add(item); } else { if (list2 == null) { list2 = new List <Preference>(3); } list2.Add(item); } } if (prefs != null) { trainingPrefs.put(userID, new GenericUserPreferenceArray(prefs)); if (list2 != null) { testPrefs.put(userID, new GenericUserPreferenceArray(list2)); } } }
private void buildAverageDiffs() { lock (this) { DataModel model = this.getDataModel(); IEnumerator <long> enumerator = model.getUserIDs(); while (enumerator.MoveNext()) { PreferenceArray array = model.getPreferencesFromUser(enumerator.Current); int num = array.length(); for (int i = 0; i < num; i++) { long key = array.getItemID(i); RunningAverage average = this.itemAverages.get(key); if (average == null) { average = new FullRunningAverage(); this.itemAverages.put(key, average); } average.addDatum((double)array.getValue(i)); } } } }
public override double itemSimilarity(long itemID1, long itemID2) { double num18; DataModel model = base.getDataModel(); PreferenceArray array = model.getPreferencesForItem(itemID1); PreferenceArray array2 = model.getPreferencesForItem(itemID2); int num = array.length(); int num2 = array2.length(); if ((num == 0) || (num2 == 0)) { return(double.NaN); } long num3 = array.getUserID(0); long num4 = array2.getUserID(0); int i = 0; int num6 = 0; double num7 = 0.0; double num8 = 0.0; double num9 = 0.0; double num10 = 0.0; double sumXY = 0.0; double num12 = 0.0; int n = 0; while (true) { int num14 = (num3 < num4) ? -1 : ((num3 > num4) ? 1 : 0); if (num14 == 0) { double num15 = array.getValue(i); double num16 = array2.getValue(num6); sumXY += num15 * num16; num7 += num15; num8 += num15 * num15; num9 += num16; num10 += num16 * num16; double num17 = num15 - num16; num12 += num17 * num17; n++; } if (num14 <= 0) { if (++i == num) { break; } num3 = array.getUserID(i); } if (num14 >= 0) { if (++num6 == num2) { break; } num4 = array2.getUserID(num6); } } if (this.centerData) { double num19 = n; double num20 = num7 / num19; double num21 = num9 / num19; double num22 = sumXY - (num21 * num7); double num23 = num8 - (num20 * num7); double num24 = num10 - (num21 * num9); num18 = this.computeResult(n, num22, num23, num24, num12); } else { num18 = this.computeResult(n, sumXY, num8, num10, num12); } if (!double.IsNaN(num18)) { num18 = this.normalizeWeightResult(num18, n, this.cachedNumUsers); } return(num18); }
public double userSimilarity(long userID1, long userID2) { double num18; DataModel model = base.getDataModel(); PreferenceArray array = model.getPreferencesFromUser(userID1); PreferenceArray array2 = model.getPreferencesFromUser(userID2); int num = array.length(); int num2 = array2.length(); if ((num == 0) || (num2 == 0)) { return(double.NaN); } long itemID = array.getItemID(0); long num4 = array2.getItemID(0); int i = 0; int num6 = 0; double num7 = 0.0; double num8 = 0.0; double num9 = 0.0; double num10 = 0.0; double sumXY = 0.0; double num12 = 0.0; int n = 0; bool flag = this.inferrer != null; while (true) { int num14 = (itemID < num4) ? -1 : ((itemID > num4) ? 1 : 0); if (flag || (num14 == 0)) { double num15; double num16; if (itemID == num4) { num15 = array.getValue(i); num16 = array2.getValue(num6); } else if (num14 < 0) { num15 = array.getValue(i); num16 = this.inferrer.inferPreference(userID2, itemID); } else { num15 = this.inferrer.inferPreference(userID1, num4); num16 = array2.getValue(num6); } sumXY += num15 * num16; num7 += num15; num8 += num15 * num15; num9 += num16; num10 += num16 * num16; double num17 = num15 - num16; num12 += num17 * num17; n++; } if (num14 <= 0) { if (++i >= num) { if (!flag || (num4 == 0x7fffffffffffffffL)) { break; } itemID = 0x7fffffffffffffffL; } else { itemID = array.getItemID(i); } } if (num14 >= 0) { if (++num6 >= num2) { if (!flag || (itemID == 0x7fffffffffffffffL)) { break; } num4 = 0x7fffffffffffffffL; } else { num4 = array2.getItemID(num6); } } } if (this.centerData) { double num19 = num7 / ((double)n); double num20 = num9 / ((double)n); double num21 = sumXY - (num20 * num7); double num22 = num8 - (num19 * num7); double num23 = num10 - (num20 * num9); num18 = this.computeResult(n, num21, num22, num23, num12); } else { num18 = this.computeResult(n, sumXY, num8, num10, num12); } if (!double.IsNaN(num18)) { num18 = this.normalizeWeightResult(num18, n, this.cachedNumItems); } return(num18); }
public double userSimilarity(long userID1, long userID2) { int num4; PreferenceArray array = this.dataModel.getPreferencesFromUser(userID1); PreferenceArray array2 = this.dataModel.getPreferencesFromUser(userID2); int num = array.length(); int num2 = array2.length(); if ((num <= 1) || (num2 <= 1)) { return(double.NaN); } array = array.clone(); array2 = array2.clone(); array.sortByValue(); array2.sortByValue(); float num3 = 1f; for (num4 = 0; num4 < num; num4++) { if (array2.hasPrefWithItemID(array.getItemID(num4))) { array.setValue(num4, num3); num3++; } } num3 = 1f; for (num4 = 0; num4 < num2; num4++) { if (array.hasPrefWithItemID(array2.getItemID(num4))) { array2.setValue(num4, num3); num3++; } } array.sortByItem(); array2.sortByItem(); long num5 = array.getItemID(0); long num6 = array2.getItemID(0); int i = 0; int num8 = 0; double num9 = 0.0; int num10 = 0; while (true) { int num11 = (num5 < num6) ? -1 : ((num5 > num6) ? 1 : 0); if (num11 == 0) { double num12 = array.getValue(i) - array2.getValue(num8); num9 += num12 * num12; num10++; } if (num11 <= 0) { if (++i >= num) { break; } num5 = array.getItemID(i); } if (num11 >= 0) { if (++num8 >= num2) { break; } num6 = array2.getItemID(num8); } } if (num10 <= 1) { return(double.NaN); } return(1.0 - ((6.0 * num9) / ((double)(num10 * ((num10 * num10) - 1))))); }