public void toyExample() { SVDRecommender svdRecommender = new SVDRecommender(dataModel, factorizer); /// a hold out test would be better, but this is just a toy example so we only check that the /// factorization is close to the original matrix IRunningAverage avg = new FullRunningAverage(); var userIDs = dataModel.GetUserIDs(); while (userIDs.MoveNext()) { long userID = userIDs.Current; foreach (IPreference pref in dataModel.GetPreferencesFromUser(userID)) { double rating = pref.GetValue(); double estimate = svdRecommender.EstimatePreference(userID, pref.GetItemID()); double err = rating - estimate; avg.AddDatum(err * err); } } double rmse = Math.Sqrt(avg.GetAverage()); Assert.True(rmse < 0.2); }
public void testRecommenderWithSyntheticData() { setUpSyntheticData(); factorizer = new ParallelSGDFactorizer(dataModel, rank, lambda, numIterations, 0.01, 1, 0, 0); svdRecommender = new SVDRecommender(dataModel, factorizer); /// a hold out test would be better, but this is just a toy example so we only check that the /// factorization is close to the original matrix IRunningAverage avg = new FullRunningAverage(); var userIDs = dataModel.GetUserIDs(); while (userIDs.MoveNext()) { long userID = userIDs.Current; foreach (IPreference pref in dataModel.GetPreferencesFromUser(userID)) { double rating = pref.GetValue(); double estimate = svdRecommender.EstimatePreference(userID, pref.GetItemID()); double err = rating - estimate; avg.AddDatum(err * err); } } double rmse = Math.Sqrt(avg.GetAverage()); logger.Info("rmse: " + rmse); Assert.True(rmse < 0.2); }
public void toyExampleImplicit() { var observations = new double[4, 4] { { 5.0, 5.0, 2.0, 0 }, { 2.0, 0, 3.0, 5.0 }, { 0, 5.0, 0, 3.0 }, { 3.0, 0, 0, 5.0 } }; var preferences = new double[4, 4] { { 1.0, 1.0, 1.0, 0 }, { 1.0, 0, 1.0, 1.0 }, { 0, 1.0, 0, 1.0 }, { 1.0, 0, 0, 1.0 } }; double alpha = 20; ALSWRFactorizer factorizer = new ALSWRFactorizer(dataModel, 3, 0.065, 5, true, alpha); SVDRecommender svdRecommender = new SVDRecommender(dataModel, factorizer); IRunningAverage avg = new FullRunningAverage(); for (int sliceIdx = 0; sliceIdx < preferences.GetLength(0); sliceIdx++) { var slice = MatrixUtil.viewRow(preferences, sliceIdx); for (var eIndex = 0; eIndex < slice.Length; eIndex++) { var e = slice[eIndex]; long userID = sliceIdx + 1; long itemID = eIndex + 1; if (!Double.IsNaN(e)) { double pref = e; double estimate = svdRecommender.EstimatePreference(userID, itemID); double confidence = 1 + alpha * observations[sliceIdx, eIndex]; double err = confidence * (pref - estimate) * (pref - estimate); avg.AddDatum(err); Console.WriteLine("Comparing preference of user [{0}] towards item [{1}], was [{2}] with confidence [{3}] " + "estimate is [{4}]", sliceIdx, eIndex, pref, confidence, estimate); } } } double rmse = Math.Sqrt(avg.GetAverage()); Console.WriteLine("RMSE: {0}", rmse); Assert.True(rmse < 0.4); }
public void recommend() { var dataModelMock = new DynamicMock(typeof(IDataModel)); var preferencesFromUserMock = new DynamicMock(typeof(IPreferenceArray)); var candidateItemsStrategyMock = new DynamicMock(typeof(ICandidateItemsStrategy)); var factorizerMock = new DynamicMock(typeof(IFactorizer)); var factorization = new Factorization_recommend_TestMock(); FastIDSet candidateItems = new FastIDSet(); candidateItems.Add(5L); candidateItems.Add(3L); factorizerMock.ExpectAndReturn("Factorize", factorization); dataModelMock.ExpectAndReturn("GetPreferencesFromUser", preferencesFromUserMock.MockInstance, (1L)); candidateItemsStrategyMock.ExpectAndReturn("GetCandidateItems", candidateItems, 1L, preferencesFromUserMock.MockInstance, dataModelMock.MockInstance); //EasyMock.replay(dataModel, candidateItemsStrategy, factorizer, factorization); SVDRecommender svdRecommender = new SVDRecommender( (IDataModel)dataModelMock.MockInstance, (IFactorizer)factorizerMock.MockInstance, (ICandidateItemsStrategy)candidateItemsStrategyMock.MockInstance); IList <IRecommendedItem> recommendedItems = svdRecommender.Recommend(1L, 5); Assert.AreEqual(2, recommendedItems.Count); Assert.AreEqual(3L, recommendedItems[0].GetItemID()); Assert.AreEqual(2.0f, recommendedItems[0].GetValue(), EPSILON); Assert.AreEqual(5L, recommendedItems[1].GetItemID()); Assert.AreEqual(1.0f, recommendedItems[1].GetValue(), EPSILON); dataModelMock.Verify(); candidateItemsStrategyMock.Verify(); factorizerMock.Verify(); Assert.AreEqual(2, factorization.getItemFeaturesCallCount); Assert.AreEqual(2, factorization.getUserFeaturesCallCount); //EasyMock.verify(dataModel, candidateItemsStrategy, factorizer, factorization); }
public void estimatePreference() { var dataModelMock = new DynamicMock(typeof(IDataModel)); var factorizerMock = new DynamicMock(typeof(IFactorizer)); var factorization = new Factorization_estimatePreference_TestMock(); factorizerMock.ExpectAndReturn("Factorize", factorization); //EasyMock.replay(dataModel, factorizer, factorization); SVDRecommender svdRecommender = new SVDRecommender((IDataModel)dataModelMock.MockInstance, (IFactorizer)factorizerMock.MockInstance); float estimate = svdRecommender.EstimatePreference(1L, 5L); Assert.AreEqual(1, estimate, EPSILON); factorizerMock.Verify(); Assert.AreEqual(1, factorization.getItemFeaturesCallCount); Assert.AreEqual(1, factorization.getUserFeaturesCallCount); //EasyMock.verify(dataModel, factorizer, factorization); }
internal Estimator(SVDRecommender svdRecommender, long theUserID) { this.theUserID = theUserID; this.svdRecommender = svdRecommender; }