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);
        }
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }