Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 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);
        }
        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);
        }
Ejemplo n.º 6
0
 internal Estimator(SVDRecommender svdRecommender, long theUserID)
 {
     this.theUserID      = theUserID;
     this.svdRecommender = svdRecommender;
 }