Example #1
0
		public void TestFile()  
        {
			UserCorrelation userCorrelation = new PearsonCorrelation(model);
			UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, userCorrelation, model);
			Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, userCorrelation);
			Assert.AreEqual(2, recommender.Recommend("A123", 3).Count);
			Assert.AreEqual(2, recommender.Recommend("B234", 3).Count);
			Assert.AreEqual(1, recommender.Recommend("C345", 3).Count);

			// Make sure this doesn't throw an exception
			model.Refresh();
		}
        public void TestDatabase()
        {
            UserCorrelation  userCorrelation = new PearsonCorrelation(model);
            UserNeighborhood neighborhood    = new NearestNUserNeighborhood(2, userCorrelation, model);
            Recommender      recommender     = new GenericUserBasedRecommender(model, neighborhood, userCorrelation);

            Assert.AreEqual(2, recommender.Recommend("A123", 3).Count);
            Assert.AreEqual(2, recommender.Recommend("B234", 3).Count);
            Assert.AreEqual(1, recommender.Recommend("C345", 3).Count);

            // Make sure this doesn't throw an exception
            model.Refresh();
        }
        public void testFile()
        {
            IUserSimilarity   userSimilarity = new PearsonCorrelationSimilarity(model);
            IUserNeighborhood neighborhood   = new NearestNUserNeighborhood(3, userSimilarity, model);
            IRecommender      recommender    = new GenericUserBasedRecommender(model, neighborhood, userSimilarity);

            Assert.AreEqual(1, recommender.Recommend(123, 3).Count);
            Assert.AreEqual(0, recommender.Recommend(234, 3).Count);
            Assert.AreEqual(1, recommender.Recommend(345, 3).Count);

            // Make sure this doesn't throw an exception
            model.Refresh(null);
        }
        public ActionResult GetRecommendedFilms(string filmIdsJson)
        {
            var filmIds = JsonConvert.DeserializeObject <long[]>(filmIdsJson);

            var dataModel = GetDataModel();

            // recommendation is performed for the user that is missed in the preferences data
            var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
            var prefArr         = new GenericUserPreferenceArray(filmIds.Length);

            prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
            for (int i = 0; i < filmIds.Length; i++)
            {
                prefArr.SetItemID(i, filmIds[i]);

                // in this example we have no ratings of movies preferred by the user
                prefArr.SetValue(i, 5); // lets assume max rating
            }
            plusAnonymModel.SetTempPrefs(prefArr);

            var similarity       = new LogLikelihoodSimilarity(plusAnonymModel);
            var neighborhood     = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
            var recommender      = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 5, null);

            return(Json(recommendedItems.Select(ri => new Dictionary <string, object>()
            {
                { "film_id", ri.GetItemID() },
                { "rating", ri.GetValue() },
            }).ToArray()));
        }
 public void TestHowMany()
 {
     List<User> users = new List<User>(3);
     users.Add(GetUser("test1", 0.1, 0.2));
     users.Add(GetUser("test2", 0.2, 0.3, 0.3, 0.6));
     users.Add(GetUser("test3", 0.4, 0.4, 0.5, 0.9));
     users.Add(GetUser("test4", 0.1, 0.4, 0.5, 0.8, 0.9, 1.0));
     users.Add(GetUser("test5", 0.2, 0.3, 0.6, 0.7, 0.1, 0.2));
     DataModel dataModel = new GenericDataModel(users);
     UserCorrelation correlation = new PearsonCorrelation(dataModel);
     UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, correlation, dataModel);
     Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, correlation);
     IList<RecommendedItem> fewRecommended = recommender.Recommend("test1", 2);
     IList<RecommendedItem> moreRecommended = recommender.Recommend("test1", 4);
     for (int i = 0; i < fewRecommended.Count; i++)
     {
         Assert.AreEqual(fewRecommended[i].Item, moreRecommended[i].Item);
     }
 }
 public void TestRescorer()
 {
     List<User> users = new List<User>(3);
     users.Add(GetUser("test1", 0.1, 0.2));
     users.Add(GetUser("test2", 0.2, 0.3, 0.3, 0.6));
     users.Add(GetUser("test3", 0.4, 0.4, 0.5, 0.9));
     DataModel dataModel = new GenericDataModel(users);
     UserCorrelation correlation = new PearsonCorrelation(dataModel);
     UserNeighborhood neighborhood = new NearestNUserNeighborhood(1, correlation, dataModel);
     Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, correlation);
     IList<RecommendedItem> originalRecommended = recommender.Recommend("test1", 2);
     IList<RecommendedItem> rescoredRecommended =
        recommender.Recommend("test1", 2, new ReversingRescorer<Item>());
     Assert.IsNotNull(originalRecommended);
     Assert.IsNotNull(rescoredRecommended);
     Assert.AreEqual(2, originalRecommended.Count);
     Assert.AreEqual(2, rescoredRecommended.Count);
     Assert.AreEqual(originalRecommended[0].Item, rescoredRecommended[1].Item);
     Assert.AreEqual(originalRecommended[1].Item, rescoredRecommended[0].Item);
 }
Example #7
0
        public void TestHowMany()
        {
            List <User> users = new List <User>(3);

            users.Add(GetUser("test1", 0.1, 0.2));
            users.Add(GetUser("test2", 0.2, 0.3, 0.3, 0.6));
            users.Add(GetUser("test3", 0.4, 0.4, 0.5, 0.9));
            users.Add(GetUser("test4", 0.1, 0.4, 0.5, 0.8, 0.9, 1.0));
            users.Add(GetUser("test5", 0.2, 0.3, 0.6, 0.7, 0.1, 0.2));
            DataModel               dataModel       = new GenericDataModel(users);
            UserCorrelation         correlation     = new PearsonCorrelation(dataModel);
            UserNeighborhood        neighborhood    = new NearestNUserNeighborhood(2, correlation, dataModel);
            Recommender             recommender     = new GenericUserBasedRecommender(dataModel, neighborhood, correlation);
            IList <RecommendedItem> fewRecommended  = recommender.Recommend("test1", 2);
            IList <RecommendedItem> moreRecommended = recommender.Recommend("test1", 4);

            for (int i = 0; i < fewRecommended.Count; i++)
            {
                Assert.AreEqual(fewRecommended[i].Item, moreRecommended[i].Item);
            }
        }
Example #8
0
        public void TestRescorer()
        {
            List <User> users = new List <User>(3);

            users.Add(GetUser("test1", 0.1, 0.2));
            users.Add(GetUser("test2", 0.2, 0.3, 0.3, 0.6));
            users.Add(GetUser("test3", 0.4, 0.4, 0.5, 0.9));
            DataModel               dataModel           = new GenericDataModel(users);
            UserCorrelation         correlation         = new PearsonCorrelation(dataModel);
            UserNeighborhood        neighborhood        = new NearestNUserNeighborhood(1, correlation, dataModel);
            Recommender             recommender         = new GenericUserBasedRecommender(dataModel, neighborhood, correlation);
            IList <RecommendedItem> originalRecommended = recommender.Recommend("test1", 2);
            IList <RecommendedItem> rescoredRecommended =
                recommender.Recommend("test1", 2, new ReversingRescorer <Item>());

            Assert.IsNotNull(originalRecommended);
            Assert.IsNotNull(rescoredRecommended);
            Assert.AreEqual(2, originalRecommended.Count);
            Assert.AreEqual(2, rescoredRecommended.Count);
            Assert.AreEqual(originalRecommended[0].Item, rescoredRecommended[1].Item);
            Assert.AreEqual(originalRecommended[1].Item, rescoredRecommended[0].Item);
        }
 public void testHowMany()
 {
     IDataModel dataModel = getDataModel(
     new long[] {1, 2, 3, 4, 5},
     new Double?[][] {
             new double?[]{0.1, 0.2},
             new double?[]{0.2, 0.3, 0.3, 0.6},
             new double?[]{0.4, 0.4, 0.5, 0.9},
             new double?[]{0.1, 0.4, 0.5, 0.8, 0.9, 1.0},
             new double?[]{0.2, 0.3, 0.6, 0.7, 0.1, 0.2},
     });
     IUserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
     IUserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
     IRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
     IList<IRecommendedItem> fewRecommended = recommender.Recommend(1, 2);
     IList<IRecommendedItem> moreRecommended = recommender.Recommend(1, 4);
     for (int i = 0; i < fewRecommended.Count; i++) {
       Assert.AreEqual(fewRecommended[i].GetItemID(), moreRecommended[i].GetItemID());
     }
     recommender.Refresh(null);
     for (int i = 0; i < fewRecommended.Count; i++) {
       Assert.AreEqual(fewRecommended[i].GetItemID(), moreRecommended[i].GetItemID());
     }
 }
        public long[] GetNNearestNeighborsUsersRecommendations(int numNeighbours, int userId)
        {
            GenericDataModel model = GetUserBasedDataModel();

            EuclideanDistanceSimilarity similarity = new EuclideanDistanceSimilarity(
                model);

            IUserNeighborhood neighborhood = new NearestNUserNeighborhood(
                20, similarity, model);

            long[] neighbors = neighborhood.GetUserNeighborhood(userId);

            var recommender =
                new GenericUserBasedRecommender(model, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(userId, 8);

            return(neighbors);
        }
Example #11
0
        public List <MovieRecommendationDto> GetRecommendedMovies(int[] preferredMovieIds)
        {
            var dataModel = GetDataModel();

            // recommendation is performed for the user that is missed in the preferences data
            var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
            var prefArr         = new GenericUserPreferenceArray(preferredMovieIds.Length);

            prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
            for (int i = 0; i < preferredMovieIds.Length; i++)
            {
                prefArr.SetItemID(i, preferredMovieIds[i]);

                // in this example we have no ratings of movies preferred by the user
                prefArr.SetValue(i, 5); // lets assume max rating
            }
            plusAnonymModel.SetTempPrefs(prefArr);

            var similarity       = new LogLikelihoodSimilarity(plusAnonymModel);
            var neighborhood     = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
            var recommender      = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 5, null);

            var movieIds = recommendedItems.Select(ri => (int)ri.GetItemID()).ToArray();
            var movieIdToTitleDictionary = _unitOfWork.MovieRepository.GetMovieIdToTileDictionary(movieIds);

            var recommendedMovies = new List <MovieRecommendationDto>();

            foreach (var item in recommendedItems)
            {
                var movieId    = (int)item.GetItemID();
                var movieTitle = movieIdToTitleDictionary[movieId];

                recommendedMovies.Add(
                    new MovieRecommendationDto
                {
                    MovieId    = movieId,
                    MovieTitle = movieTitle,
                    Rating     = item.GetValue()
                });
            }

            return(recommendedMovies);
        }
        public List <int> GetRecommendations(int userId)
        {
            GenericDataModel model = GetUserBasedDataModel();

            EuclideanDistanceSimilarity similarity = new EuclideanDistanceSimilarity(
                model);

            IUserNeighborhood neighborhood = new NearestNUserNeighborhood(
                15, similarity, model);

            long[] neighbors = neighborhood.GetUserNeighborhood(userId);

            var recommender =
                new GenericUserBasedRecommender(model, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(userId, 12);

            var bookIds = recommendedItems.Select(ri => (int)ri.GetItemID()).ToList();

            return(bookIds);
        }
Example #13
0
        public ActionResult Test()
        {
            //构建用户行为数组

            string filmIdsJson = "[6090,5461,5426]";

            var filmIds        = (new JavaScriptSerializer()).Deserialize <long[]>(filmIdsJson);
            var pathToDataFile =
                Path.Combine(System.Web.HttpRuntime.AppDomainAppPath, "data/ratings.dat");

            if (dataModel == null)
            {
                dataModel = new FileDataModel(pathToDataFile, false, FileDataModel.DEFAULT_MIN_RELOAD_INTERVAL_MS, false);
            }

            var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
            var prefArr         = new GenericUserPreferenceArray(filmIds.Length);

            prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
            for (int i = 0; i < filmIds.Length; i++)
            {
                prefArr.SetItemID(i, filmIds[i]);
                prefArr.SetValue(i, 5); // lets assume max rating
            }
            plusAnonymModel.SetTempPrefs(prefArr);

            var similarity       = new LogLikelihoodSimilarity(plusAnonymModel);
            var neighborhood     = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
            var recommender      = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 5, null);

            return(Json(recommendedItems.Select(ri => new Dictionary <string, object>()
            {
                { "film_id", ri.GetItemID() },
                { "rating", ri.GetValue() },
            }).ToArray(), JsonRequestBehavior.AllowGet));
        }
        public void testFile()
        {
            IUserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
            IUserNeighborhood neighborhood = new NearestNUserNeighborhood(3, userSimilarity, model);
            IRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, userSimilarity);
            Assert.AreEqual(1, recommender.Recommend(123, 3).Count);
            Assert.AreEqual(0, recommender.Recommend(234, 3).Count);
            Assert.AreEqual(1, recommender.Recommend(345, 3).Count);

            // Make sure this doesn't throw an exception
            model.Refresh(null);
        }
        public ActionResult GetRecommendedbooks()
        {
            var csv            = new CsvReader(new StreamReader(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/books.csv")));
            var records        = csv.GetRecords <BookRecord>().ToList();
            int favouriteGenre = db.Users.Where(u => u.UserName == User.Identity.Name).Select(u => u.genreID).SingleOrDefault();
            var userRentals    = db.Rentals.Where(m => m.rentalUser == User.Identity.Name).Join(db.Books,
                                                                                                r => r.rentalBook,
                                                                                                m => m.bookName,
                                                                                                (r, m) => new
            {
                genreId   = m.genreID,
                bookName  = m.bookName,
                rentalUer = r.rentalUser
            });

            if (userRentals.Count() == 0)
            {
                return(Json(new Dictionary <string, object>()
                {
                    { "book_id", 0 },
                    { "rating", 0 },
                }));
            }
            else if (userRentals.Where(m => m.genreId == favouriteGenre).Count() != 0)
            {
                userRentals = userRentals.Where(m => m.genreId == favouriteGenre);
            }

            long[] bookIdsTemp = new long[userRentals.Count()];
            int    bookCounter = 0;

            foreach (var item in userRentals)
            {
                foreach (var record in records)
                {
                    if (item.bookName == record.title)
                    {
                        if (!bookIdsTemp.Contains(record.bookId))
                        {
                            bookIdsTemp[bookCounter] = record.bookId;
                            bookCounter++;
                        }
                    }
                }
            }
            long[] bookIds = new long[bookCounter];
            for (int i = 0; i < bookCounter; i++)
            {
                bookIds[i] = bookIdsTemp[i];
            }

            var dataModel = GetDataModel();

            // recommendation is performed for the user that is missed in the preferences data
            var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
            var prefArr         = new GenericUserPreferenceArray(userRentals.Count());

            prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
            for (int i = 0; i < bookIds.Length; i++)
            {
                prefArr.SetItemID(i, bookIds[i]);

                // in this example we have no ratings of books preferred by the user
                prefArr.SetValue(i, 5); // lets assume max rating
            }
            plusAnonymModel.SetTempPrefs(prefArr);

            var similarity       = new LogLikelihoodSimilarity(plusAnonymModel);
            var neighborhood     = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
            var recommender      = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
            var recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 1, null);

            if (recommendedItems.Count() == 0)
            {
                return(Json(new Dictionary <string, object>()
                {
                    { "book_id", 0 },
                    { "rating", 0 },
                }));
            }

            return(Json(recommendedItems.Select(ri => new Dictionary <string, object>()
            {
                { "book_id", ri.GetItemID() },
                { "rating", ri.GetValue() },
            }).ToArray()[0]));
        }
 public void testRescorer()
 {
     IDataModel dataModel = getDataModel(
     new long[] {1, 2, 3},
     new Double?[][] {
             new double?[]{0.1, 0.2},
             new double?[]{0.2, 0.3, 0.3, 0.6},
             new double?[]{0.4, 0.5, 0.5, 0.9},
     });
     IUserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
     IUserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
     IRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
     IList<IRecommendedItem> originalRecommended = recommender.Recommend(1, 2);
     IList<IRecommendedItem> rescoredRecommended =
     recommender.Recommend(1, 2, new ReversingRescorer<long>());
     Assert.NotNull(originalRecommended);
     Assert.NotNull(rescoredRecommended);
     Assert.AreEqual(2, originalRecommended.Count);
     Assert.AreEqual(2, rescoredRecommended.Count);
     Assert.AreEqual(originalRecommended[0].GetItemID(), rescoredRecommended[1].GetItemID());
     Assert.AreEqual(originalRecommended[1].GetItemID(), rescoredRecommended[0].GetItemID());
 }
Example #17
0
        /// <summary>
        /// 推荐
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">页容量</param>
        /// <param name="showCount">显示数量</param>
        /// <returns></returns>
        public List <Books> RecommendBooks(int pageIndex, int pageSize, int showCount)
        {
            #region 推荐
            List <Books> books = null;
            if (Session["user"] != null)
            {
                Users user = Session["user"] as Users;

                #region 构建用户行为数组
                var           loglist = logbll.LoadEntities(c => c.userID == user.Id).ToList();
                StringBuilder sb      = new StringBuilder();
                if (loglist.Count > 0)
                {
                    sb.Append("[");
                    int j = 0;
                    foreach (var item in loglist)
                    {
                        j++;
                        sb.Append(item.itemID.ToString());
                        if (j != loglist.Count)
                        {
                            sb.Append(",");
                        }
                    }
                    sb.Append("]");
                }
                #endregion

                if (string.IsNullOrEmpty(sb.ToString()))
                {
                    //冷启动
                    books = booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                }
                else
                {
                    var filmIds = (new JavaScriptSerializer()).Deserialize <long[]>(sb.ToString());

                    var    logmodel = settingbll.LoadEntities(c => c.id == 16).FirstOrDefault();
                    string path     = "";
                    if (logmodel != null && logmodel.value == "true")
                    {
                        path = "data/ratings1.dat";
                    }
                    else
                    {
                        path = "data/ratings.dat";
                    }

                    var pathToDataFile =
                        Path.Combine(System.Web.HttpRuntime.AppDomainAppPath, path);

                    if (dataModel == null)
                    {
                        dataModel = new FileDataModel(pathToDataFile, false, FileDataModel.DEFAULT_MIN_RELOAD_INTERVAL_MS, false);
                    }

                    var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
                    var prefArr         = new GenericUserPreferenceArray(filmIds.Length);
                    prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
                    for (int i = 0; i < filmIds.Length; i++)
                    {
                        prefArr.SetItemID(i, filmIds[i]);
                        prefArr.SetValue(i, 5); // lets assume max rating
                    }
                    plusAnonymModel.SetTempPrefs(prefArr);

                    var          similarity       = new LogLikelihoodSimilarity(plusAnonymModel);
                    var          neighborhood     = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
                    var          recommender      = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
                    var          recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, showCount, null);
                    List <Books> newbooks         = new List <Books>();
                    foreach (var item in recommendedItems)
                    {
                        int bid = Convert.ToInt32(item.GetItemID());
                        newbooks.Add(booksbll.LoadEntities(c => c.Id == bid).FirstOrDefault());
                    }

                    books = newbooks.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                }
            }
            else //不推荐
            {
                books = booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            }
            #endregion

            return(books.Count() <= 0 ? booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList() : books);
        }