public void Train() { Console.WriteLine("***************** Train Matrix Factorization Model *********************"); mf = FactorizationMatrix.newRandomMatrix(trainUsers, trainItems, cFeatures, miu); double error; double actualRating; double predictedRating; double prevRmse = Double.MaxValue; EvaluationEngine evaluationEngine = new EvaluationEngine(miu); double currRmse = evaluationEngine.computeRMSE(validationUsers, validationItems, this); int iteration = 1; while (prevRmse > currRmse) //TODO Eyal - add num iteration and improvment threshold conditions { Console.WriteLine("Iteraion: {0}, Current RMSE: {1}", iteration, currRmse); foreach (User user in trainUsers) { foreach (string itemId in user.GetRatedItems()) { Item item = trainItems.GetItemById(itemId); actualRating = user.GetRating(item.GetId()); predictedRating = mf.Predict(user, item); error = actualRating - predictedRating; var userBias = mf.getBu(user); mf.setBu(user, userBias + yRate * (error - lambdaRate * userBias)); var itemBias = mf.getBi(item); mf.setBi(item, itemBias + yRate * (error - lambdaRate * itemBias)); //update Qi and Pu mf.UpdateQiAndPu(item, user, error); } } prevRmse = currRmse; currRmse = evaluationEngine.computeRMSE(validationUsers, validationItems, this); iteration++; } Console.WriteLine(String.Format("Final Result - RMSE = {0}", prevRmse)); }
public Dictionary <PredictionMethod, double> ComputeRMSE(List <PredictionMethod> lMethods, int cTrials = 0) { Console.WriteLine("***************** Model Evaluation *********************"); Dictionary <RecommenderSystem.PredictionMethod, double> results = new Dictionary <PredictionMethod, double>(); foreach (var method in lMethods) { IPredictionModel model = predictionEngine.getModel(method); if (model != null) { var rmse = evaluationEngine.computeRMSE(testUsers, testItems, model); Console.WriteLine(String.Format("Model: {0}, RMSE: {1}", method, rmse)); results.Add(method, rmse); } } Console.WriteLine("*************************************************************"); return(results); }