Example usage for org.apache.mahout.cf.taste.model PreferenceArray getValue

List of usage examples for org.apache.mahout.cf.taste.model PreferenceArray getValue

Introduction

In this page you can find the example usage for org.apache.mahout.cf.taste.model PreferenceArray getValue.

Prototype

float getValue(int i);

Source Link

Usage

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);
    }
}