@Override public LeastSquaresItemScorer get() { Collection<RatingMatrixEntry> ratings = snapshot.getRatings(); logger.debug("training predictor on {} ratings", ratings.size()); double uoff[] = new double[snapshot.getUserIds().size()]; double ioff[] = new double[snapshot.getItemIds().size()]; Long2DoubleMap svuoff = Long2DoubleSortedArrayMap.fromArray(snapshot.userIndex(), uoff); Long2DoubleMap svioff = Long2DoubleSortedArrayMap.fromArray(snapshot.itemIndex(), ioff); return new LeastSquaresItemScorer(svuoff, svioff, mean);
@Override public RandomDataSplitStrategy get() { final int userNum = snapshot.userIndex().size(); final int itemNum = snapshot.itemIndex().size(); logger.info("Rating matrix size: {} users and {} items", userNum, itemNum); List<RatingMatrixEntry> allRatings = new ArrayList<>(snapshot.getRatings()); final int size = allRatings.size(); final int validationSize = Math.toIntExact(Math.round(size*proportion)); logger.info("validation set size: {} ratings", validationSize); Collections.shuffle(allRatings, random); List<RatingMatrixEntry> subList = allRatings.subList(0, validationSize); final List<RatingMatrixEntry> validationRatings = ImmutableList.copyOf(subList); subList.clear(); logger.info("validation rating size: {}", validationRatings.size()); final KeyIndex userIndex = snapshot.userIndex(); final KeyIndex itemIndex = snapshot.itemIndex(); return new RandomDataSplitStrategy(allRatings, validationRatings, userIndex, itemIndex); } }
/** * Initialize the training estimator. * @param snap The getEntry snapshot. * @param baseline The baseline predictor. * @param dom The getEntry domain (for clamping). */ TrainingEstimator(RatingMatrix snap, BiasModel baseline, PreferenceDomain dom) { ratings = snap.getRatings(); domain = dom; estimates = new double[ratings.size()]; final LongCollection userIds = snap.getUserIds(); LongIterator userIter = userIds.iterator(); double global = baseline.getIntercept(); for (RatingMatrixEntry r: snap.getRatings()) { double userBias = baseline.getUserBias(r.getUserId()); double itemBias = baseline.getItemBias(r.getItemId()); estimates[r.getIndex()] = global + userBias + itemBias; } }
double rmse = Double.MAX_VALUE * 0.5; double trail = initialValue * initialValue * (featureCount - feature - 1); List<RatingMatrixEntry> ratings = snapshot.getRatings(); int epoch = 0; while (rule.keepGoing(epoch, rmse, oldRMSE)) {
@Test public void testGetRatings() throws Exception { RandomDataSplitStrategyProvider splitData = new RandomDataSplitStrategyProvider(snapshot, new Random(), 0, 0.2); DataSplitStrategy splitStrategy = splitData.get(); KeyIndex userIndex = splitStrategy.getUserIndex(); KeyIndex itemIndex = splitStrategy.getItemIndex(); List<RatingMatrixEntry> validations = splitStrategy.getValidationRatings(); List<RatingMatrixEntry> trainingRatings = splitStrategy.getTrainRatings(); for (RatingMatrixEntry re : trainingRatings) { int user = re.getUserIndex(); int item = re.getItemIndex(); long userId = userIndex.getKey(user); long itemId = itemIndex.getKey(item); double rating = re.getValue(); assertThat(rating, equalTo(snapshot.getUserRatingVector(userId).get(itemId))); assertThat(rating, equalTo(data.get(itemId).get(userId))); } for (RatingMatrixEntry re : validations) { long userId = re.getUserId(); long itemId = re.getItemId(); double rating = re.getValue(); assertThat(rating, equalTo(snapshot.getUserRatingVector(userId).get(itemId))); assertThat(rating, equalTo(data.get(itemId).get(userId))); } }
/** * Initialize the training estimator. * @param snap The getEntry snapshot. * @param baseline The baseline predictor. * @param dom The getEntry domain (for clamping). */ TrainingEstimator(RatingMatrix snap, BiasModel baseline, PreferenceDomain dom) { ratings = snap.getRatings(); domain = dom; estimates = new double[ratings.size()]; final LongCollection userIds = snap.getUserIds(); LongIterator userIter = userIds.iterator(); double global = baseline.getIntercept(); for (RatingMatrixEntry r: snap.getRatings()) { double userBias = baseline.getUserBias(r.getUserId()); double itemBias = baseline.getItemBias(r.getItemId()); estimates[r.getIndex()] = global + userBias + itemBias; } }
double trail = initialValue * initialValue * (featureCount - feature - 1); TrainingLoopController controller = rule.getTrainingLoopController(); List<RatingMatrixEntry> ratings = snapshot.getRatings(); while (controller.keepTraining(rmse)) { rmse = doFeatureIteration(estimates, ratings, userFeatureVector, itemFeatureVector, trail);
@Override public FunkSVDModel get() { int userCount = snapshot.getUserIds().size(); RealMatrix userFeatures = MatrixUtils.createRealMatrix(userCount, featureCount); int itemCount = snapshot.getItemIds().size(); RealMatrix itemFeatures = MatrixUtils.createRealMatrix(itemCount, featureCount); featureCount, snapshot.getRatings().size()); snapshot.userIndex(), snapshot.itemIndex(), featureInfo);
@Override public LeastSquaresItemScorer get() { Collection<RatingMatrixEntry> ratings = snapshot.getRatings(); logger.debug("training predictor on {} ratings", ratings.size()); double uoff[] = new double[snapshot.getUserIds().size()]; double ioff[] = new double[snapshot.getItemIds().size()]; Long2DoubleMap svuoff = Long2DoubleSortedArrayMap.fromArray(snapshot.userIndex(), uoff); Long2DoubleMap svioff = Long2DoubleSortedArrayMap.fromArray(snapshot.itemIndex(), ioff); return new LeastSquaresItemScorer(svuoff, svioff, mean);
@Override public FunkSVDModel get() { int userCount = snapshot.getUserIds().size(); RealMatrix userFeatures = MatrixUtils.createRealMatrix(userCount, featureCount); int itemCount = snapshot.getItemIds().size(); RealMatrix itemFeatures = MatrixUtils.createRealMatrix(itemCount, featureCount); featureCount, snapshot.getRatings().size()); snapshot.userIndex(), snapshot.itemIndex(), featureInfo);