List of usage examples for org.apache.mahout.cf.taste.model PreferenceArray getValue
float getValue(int i);
From source file:com.anjuke.romar.mahout.persistence.FilePreferenceSource.java
License:Apache License
@Override public void compact() { // ????/*from w w w .j av a 2 s . c om*/ final long version = getCurrentVersion() - 1; if (version < 0) { return; } File latestSnapshotFile = getLatestSnapshotFile(); if (latestSnapshotFile != null && getSnapshotFileVersion(latestSnapshotFile) == version) { return; } synchronized (_snapshotWriterLock) { PrintWriter snapshotWriter = createWriter(getSnapshotFile(version)); try { final List<File> logFileList = getLogFileListUntilVersion(version); List<File> fileToIt = new ArrayList<File>(logFileList); if (latestSnapshotFile != null) { fileToIt.add(0, latestSnapshotFile); } PreferenceIterator it = new LogFileIterator(fileToIt); FastByIDMap<PreferenceArray> data = new FastByIDMap<PreferenceArray>(); while (it.hasNext()) { Preference pref = it.next(); if (it.getType() == PreferenceType.ADD) { Util.applyAdd(data, pref); } else if (it.getType() == PreferenceType.DELETE) { Util.applyRemove(data, pref); } } for (Entry<Long, PreferenceArray> entry : data.entrySet()) { PreferenceArray array = entry.getValue(); for (int i = 0, length = array.length(); i < length; i++) { long userID = array.getUserID(i); long itemID = array.getItemID(i); float value = array.getValue(i); snapshotWriter.print(userID); snapshotWriter.print(','); snapshotWriter.print(itemID); snapshotWriter.print(','); snapshotWriter.println(value); } } snapshotWriter.flush(); snapshotWriter.close(); removeFile(); } finally { snapshotWriter.close(); } } }
From source file:com.anjuke.romar.mahout.persistence.FilePreferenceSourceTest.java
License:Apache License
@Test public void testGetPreferenceData() { source.setPreference(2, 3, 2);//w ww. j a v a2 s . c o m source.removePreference(2, 3); source.setPreference(1, 1, 2); source.setPreference(3, 4, 2); source.setPreference(3, 5, 3); source.commit(); source.setPreference(5, 4, 1.0f); source.compact(); source.close(); source = new FilePreferenceSource(path); FastByIDMap<PreferenceArray> data = source.getPreferenceUserData(); PreferenceArray id2 = data.get(2); assertNull(id2); PreferenceArray id1 = data.get(1); assertNotNull(id1); assertEquals(1, id1.getItemID(0)); assertEquals(2.0f, id1.getValue(0), 0f); PreferenceArray id3 = data.get(3); assertNotNull(id3); assertEquals(4, id3.getItemID(0)); assertEquals(2.0f, id3.getValue(0), 0f); assertEquals(5, id3.getItemID(1)); assertEquals(3.0f, id3.getValue(1), 0f); PreferenceArray id5 = data.get(5); assertNotNull(id5); assertEquals(4, id5.getItemID(0)); assertEquals(1.0f, id5.getValue(0), 0f); }
From source file:de.tuberlin.dima.recsys.ssnmm.interactioncut.BiasedItemBasedRecommender.java
License:Apache License
private static Float getPreferenceForItem(PreferenceArray preferencesFromUser, long itemID) { int size = preferencesFromUser.length(); for (int i = 0; i < size; i++) { if (preferencesFromUser.getItemID(i) == itemID) { return preferencesFromUser.getValue(i); }//from w w w . j a v a 2 s .c o m } return null; }
From source file:lib.eval.AbstractRecommenderEvaluator.java
License:Apache License
private void processOneUser(double trainingPercentage, FastByIDMap<PreferenceArray> trainingUsers, FastByIDMap<PreferenceArray> testUserPrefs, long userID, DataModel dataModel) throws TasteException { List<Preference> trainingPrefs = null; List<Preference> testPrefs = null; PreferenceArray prefs = dataModel.getPreferencesFromUser(userID); int size = prefs.length(); for (int i = 0; i < size; i++) { Preference newPref = new GenericPreference(userID, prefs.getItemID(i), prefs.getValue(i)); if (random.nextDouble() < trainingPercentage) { if (trainingPrefs == null) { trainingPrefs = new ArrayList<Preference>(3); }/*from w w w .j a v a 2 s. c om*/ trainingPrefs.add(newPref); } else { if (testPrefs == null) { testPrefs = new ArrayList<Preference>(3); } testPrefs.add(newPref); } } if (trainingPrefs != null) { trainingUsers.put(userID, new GenericUserPreferenceArray(trainingPrefs)); if (testPrefs != null) { testUserPrefs.put(userID, new GenericUserPreferenceArray(testPrefs)); } } }
From source file:lib.similarity.AbstractUnboundedSimilarity.java
License:Apache License
@Override public double userSimilarity(long userID1, long userID2) throws TasteException { DataModel dataModel = getDataModel(); PreferenceArray xPrefs = dataModel.getPreferencesFromUser(userID1); PreferenceArray yPrefs = dataModel.getPreferencesFromUser(userID2); int xLength = xPrefs.length(); int yLength = yPrefs.length(); if (xLength == 0 || yLength == 0) { return Double.NaN; }//from w w w. java2s . c o m long xIndex = xPrefs.getItemID(0); long yIndex = yPrefs.getItemID(0); int xPrefIndex = 0; int yPrefIndex = 0; boolean hasInferrer = inferrer != null; boolean hasPrefTransform = prefTransform != null; SimilarityAccumulator accum = getSimilarityAccumulator(); while (true) { int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0; if (hasInferrer || compare == 0) { double x; double y; if (xIndex == yIndex) { // Both users expressed a preference for the item if (hasPrefTransform) { x = prefTransform.getTransformedValue(xPrefs.get(xPrefIndex)); y = prefTransform.getTransformedValue(yPrefs.get(yPrefIndex)); } else { x = xPrefs.getValue(xPrefIndex); y = yPrefs.getValue(yPrefIndex); } } else { // Only one user expressed a preference, but infer the other one's preference and tally // as if the other user expressed that preference if (compare < 0) { // X has a value; infer Y's x = hasPrefTransform ? prefTransform.getTransformedValue(xPrefs.get(xPrefIndex)) : xPrefs.getValue(xPrefIndex); y = inferrer.inferPreference(userID2, xIndex); } else { // compare > 0 // Y has a value; infer X's x = inferrer.inferPreference(userID1, yIndex); y = hasPrefTransform ? prefTransform.getTransformedValue(yPrefs.get(yPrefIndex)) : yPrefs.getValue(yPrefIndex); } } accum.processPrefPair(x, y); } if (compare <= 0) { if (++xPrefIndex >= xLength) { if (hasInferrer) { // Must count other Ys; pretend next X is far away if (yIndex == Long.MAX_VALUE) { // ... but stop if both are done! break; } xIndex = Long.MAX_VALUE; } else { break; } } else { xIndex = xPrefs.getItemID(xPrefIndex); } } if (compare >= 0) { if (++yPrefIndex >= yLength) { if (hasInferrer) { // Must count other Xs; pretend next Y is far away if (xIndex == Long.MAX_VALUE) { // ... but stop if both are done! break; } yIndex = Long.MAX_VALUE; } else { break; } } else { yIndex = yPrefs.getItemID(yPrefIndex); } } } double result; result = accum.computeResult(); if (similarityTransform != null) { result = similarityTransform.transformSimilarity(userID1, userID2, result); } return result; }
From source file:lib.similarity.AbstractUnboundedSimilarity.java
License:Apache License
@Override public final double itemSimilarity(long itemID1, long itemID2) throws TasteException { DataModel dataModel = getDataModel(); PreferenceArray xPrefs = dataModel.getPreferencesForItem(itemID1); PreferenceArray yPrefs = dataModel.getPreferencesForItem(itemID2); int xLength = xPrefs.length(); int yLength = yPrefs.length(); if (xLength == 0 || yLength == 0) { return Double.NaN; }//from ww w.ja v a 2s .c o m long xIndex = xPrefs.getUserID(0); long yIndex = yPrefs.getUserID(0); int xPrefIndex = 0; int yPrefIndex = 0; // No, pref inferrers and transforms don't appy here. I think. SimilarityAccumulator accum = getSimilarityAccumulator(); while (true) { int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0; if (compare == 0) { // Both users expressed a preference for the item double x = xPrefs.getValue(xPrefIndex); double y = yPrefs.getValue(yPrefIndex); accum.processPrefPair(x, y); } if (compare <= 0) { if (++xPrefIndex == xLength) { break; } xIndex = xPrefs.getUserID(xPrefIndex); } if (compare >= 0) { if (++yPrefIndex == yLength) { break; } yIndex = yPrefs.getUserID(yPrefIndex); } } double result; result = accum.computeResult(); if (similarityTransform != null) { result = similarityTransform.transformSimilarity(itemID1, itemID2, result); } return result; }
From source file:net.ufida.info.mahout.common.MemoryDiffStorage.java
License:Apache License
@Override public void addItemPref(long userID, long itemIDA, float prefValue) throws TasteException { PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID); try {/* w w w. j ava 2 s . com*/ buildAverageDiffsLock.writeLock().lock(); 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.writeLock().unlock(); } }
From source file:net.ufida.info.mahout.common.MemoryDiffStorage.java
License:Apache License
@Override public void removeItemPref(long userID, long itemIDA, float prefValue) throws TasteException { PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID); try {/*from w ww .j a v a 2 s .c om*/ buildAverageDiffsLock.writeLock().lock(); 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.writeLock().unlock(); } }
From source file:net.ufida.info.mahout.common.MemoryDiffStorage.java
License:Apache License
private long processOneUser(long averageCount, long userID) throws TasteException { 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); //movieId FastByIDMap<RunningAverage> aMap = averageDiffs.get(itemIDA); if (aMap == null) { aMap = new FastByIDMap<RunningAverage>(); averageDiffs.put(itemIDA, aMap); }//from w ww . ja v a 2 s.co m for (int j = i + 1; j < length; j++) { // This is a performance-critical block long itemIDB = userPreferences.getItemID(j); //userPreferences 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; }
From source file:net.ufida.info.mahout.common.SlopeOneRecommender.java
License:Apache License
private float doEstimatePreference(long userID, long itemID) throws TasteException { 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) { double stdev = ((RunningAverageAndStdDev) averageDiff).getStandardDeviation(); if (!Double.isNaN(stdev)) { weight /= 1.0 + stdev; }/*w w w. jav a2s . c o m*/ // 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); } }