/*
* Copyright (C) 2012 Sebastian Schelter <sebastian.schelter [at] tu-berlin.de>
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package de.tuberlin.dima.recsys.ssnmm.interactioncut;
import com.google.common.collect.Lists;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.similarity.CachingItemSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.Recommender;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Compute the prediction error achieved by several 'interaction-cuts'
*/
public class Evaluate {
public static void main(String[] args) throws Exception {
DataModel interactions = new FileDataModel(new File("/home/ssc/Entwicklung/datasets/movielens1M/movielens.csv"));
//DataModel interactions = new FileDataModel(new File("/home/ssc/Entwicklung/datasets/flixster/ratings.txt"));
int k = 80;
double lambda2 = 10;
double lambda3 = 25;
double trainingPercentage = 0.8;
int numRuns = 10;
int minP = 800;
int maxP = 800;
int pStepSize = 250;
runEvaluation(interactions, k, lambda2, lambda3, trainingPercentage, numRuns, minP, maxP, pStepSize);
}
static void runEvaluation(DataModel interactions, int k, double lambda2, double lambda3, double trainingPercentage,
int numRuns, int minP, int maxP, int pStepSize) throws IOException, TasteException {
RecommenderEvaluator maeEvaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
List<Errors> errors = Lists.newArrayList();
for (int maxPrefsPerUser = minP; maxPrefsPerUser <= maxP; maxPrefsPerUser += pStepSize) {
Errors error = new Errors(maxPrefsPerUser);
for (int n = 0; n < numRuns; n++) {
double maeSampled = maeEvaluator.evaluate(new BiasedRecommenderBuilder(lambda2, lambda3, k),
new InteractionCutDataModelBuilder(maxPrefsPerUser), interactions, trainingPercentage,
1 - trainingPercentage);
error.record(0, maeSampled);
}
errors.add(error);
}
for (Errors res : errors) {
System.out.println(res);
}
}
static class BiasedRecommenderBuilder implements RecommenderBuilder {
private final int k;
private final double lambda2;
private final double lambda3;
BiasedRecommenderBuilder(double lambda2, double lambda3, int k) {
this.lambda2 = lambda2;
this.lambda3 = lambda3;
this.k = k;
}
@Override
public Recommender buildRecommender(DataModel dataModel) throws TasteException {
return new BiasedItemBasedRecommender(dataModel, new CachingItemSimilarity(
new TanimotoCoefficientSimilarity(dataModel), 10000000), k, lambda2, lambda3);
}
}
}