Esempio n. 1
0
        public async Task CollaborativeFilteringCalculationTest()
        {
            var marks = new List <Mark>()
            {
                new Mark(1, 1, 5),
                new Mark(1, 2, 1),
                new Mark(1, 3, 4),
                new Mark(1, 4, 3),

                new Mark(2, 1, 4),
                new Mark(2, 2, 2),
                new Mark(2, 3, 4),
                new Mark(2, 4, 5),
                new Mark(2, 5, 5),
                new Mark(2, 6, 4),
                new Mark(2, 7, 1),

                new Mark(3, 1, 1),
                new Mark(3, 2, 4),
                new Mark(3, 3, 2),
                new Mark(3, 6, 1),
            };

            var clusterDefiner = new MinMarkDifferenceClusterStrategy <int, int>();
            var filtering      = new CollaborativeFiltering <int, int>(marks, clusterDefiner);
            var cluster        = await filtering.GetCluster(1);

            Console.WriteLine(cluster);

            Assert.Contains(2, cluster.Values);
            Assert.Contains(3, cluster.Values);
            Assert.DoesNotContain(1, cluster.Values);
            Assert.Equal(2, cluster.Count);
            Assert.Equal(2, cluster.First().Value);
        }
Esempio n. 2
0
        public IActionResult Recommendations(float kPercentage, int recommendationNumber, DateTime startDate, DateTime endDate)
        {
            /*************************************************************************************/
            //    Sample test data
            /*************************************************************************************/
            //List<UserItemPurchase> userItemPurchasesSample = new List<UserItemPurchase>();

            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item1"));
            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item2"));
            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item2"));
            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item3"));
            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item3"));
            //userItemPurchasesSample.Add(new UserItemPurchase(1, "item3"));
            //userItemPurchasesSample.Add(new UserItemPurchase(2, "item1"));
            //userItemPurchasesSample.Add(new UserItemPurchase(2, "item1"));
            //userItemPurchasesSample.Add(new UserItemPurchase(2, "item1"));
            //userItemPurchasesSample.Add(new UserItemPurchase(2, "item2"));
            //userItemPurchasesSample.Add(new UserItemPurchase(3, "item2"));
            //userItemPurchasesSample.Add(new UserItemPurchase(3, "item2"));
            //userItemPurchasesSample.Add(new UserItemPurchase(3, "item3"));

            //IEnumerable<UserItemPurchase> userItemPurchases = userItemPurchasesSample;

            /*************************************************************************************/
            //    Run KNN item based similarity
            /*************************************************************************************/
            //        IEnumerable<UserItemPurchase> userItemPurchases = _dbContext.UkRetailOriginalSales
            //.Where(a => a.InvoiceDate >= startDate && a.InvoiceDate <= endDate && a.CustomerID != null && (string.Compare(a.StockCode, "20000") <= 0))
            //.Select(a => new UserItemPurchase { User = a.CustomerID.GetValueOrDefault(), Item = a.StockCode });

            //K is number of similar users
            //K is number of similar users
            IList <UserItemPurchase> userItemPurchases = _dbContext.UkRetailOriginalSales
                                                         .Where(a => a.InvoiceDate.Date >= startDate.Date && a.InvoiceDate.Date <= endDate.Date &&
                                                                a.CustomerID != null && a.CustomerID < 12350 && a.Quantity > 0 &&
                                                                string.Compare(a.StockCode, "a") == -1)
                                                         .Select(a => new UserItemPurchase {
                User = a.CustomerID.GetValueOrDefault(), Item = a.StockCode
            }).ToList();
            List <List <RecommendedItems> > recommendedItemsList3CfTypes = new List <List <RecommendedItems> >();
            CollaborativeFiltering          collaborativeFiltering       = new CollaborativeFiltering();
            int kValue = Convert.ToInt32(Math.Floor((kPercentage / 100) * userItemPurchases.Select(a => a.User).Distinct().Count()));

            recommendedItemsList3CfTypes = collaborativeFiltering.Recommend3CfTypes(userItemPurchases, kValue, recommendationNumber);

            SavetoDatabase(recommendedItemsList3CfTypes);
            /*************************************************************************************/
            //    Dispaly results
            /*************************************************************************************/
            return(View(recommendedItemsList3CfTypes));
        }
Esempio n. 3
0
        public IEnumerable <GameDTO> GetGamesByCollaborative(Guid gamekey, UserDTO userDTO = null)
        {
            //var user = _unitOfWork.Users.Get(x => x.IsWoman == userDTO.IsWoman && x.Adulthood == userDTO.Adulthood);

            var         user = _unitOfWork.Users.GetAll();
            UserProfile currentUserProfile = new UserProfile(Guid.NewGuid(), new Guid[] { gamekey });
            var         profiles           = new List <UserProfile>();

            for (int i = 0; i < user.Count(); i++)
            {
                var orders   = _unitOfWork.Orders.Get(u => u.UserId == user.ToArray()[i].Id);
                var orderDet = _unitOfWork.OrderDetails.Get(od => orders.Any(o => od.OrderId == o.Id));
                var games    = _unitOfWork.Games.Get(g => orderDet.Any(o => g.Id == o.GameId));

                var gamesId = new Guid[games.Count()];

                for (int j = 0; j < games.Count(); j++)
                {
                    gamesId[j] = games.ToArray()[j].Id;
                }


                if (user.ToArray()[i].Id == userDTO.Id)
                {
                    var gamesIds = new Guid[games.Count() + 1];
                    for (int j = 0; j < gamesId.Count(); j++)
                    {
                        gamesIds[j] = gamesId[j];
                    }
                    gamesIds[games.Count()] = gamekey;
                    currentUserProfile      = new UserProfile(user.ToArray()[i].Id, gamesId);
                }

                profiles.Add(new UserProfile(user.ToArray()[i].Id, gamesId));
            }


            var simiarity = new JaccardSimilarity();
            var engine    = new CollaborativeFiltering();

            var results = engine.recommend(profiles, simiarity, currentUserProfile);

            var games3 = _unitOfWork.Games.Get(x => results.Any(r => x.Id == r.Key));


            if (results.ElementAt(0).Value == 0)
            {
                var user2     = user.Where(x => x.IsWoman == userDTO.IsWoman && x.Adulthood == userDTO.Adulthood);
                var profiles2 = new List <UserProfile>();

                for (int i = 0; i < user2.Count(); i++)
                {
                    var orders   = _unitOfWork.Orders.Get(u => u.UserId == user.ToArray()[i].Id);
                    var orderDet = _unitOfWork.OrderDetails.Get(od => orders.Any(o => od.OrderId == o.Id));
                    var games    = _unitOfWork.Games.Get(g => orderDet.Any(o => g.Id == o.GameId));

                    var gamesId = new Guid[games.Count()];

                    for (int j = 0; j < games.Count(); j++)
                    {
                        gamesId[j] = games.ToArray()[j].Id;
                    }


                    if (user2.ToArray()[i].Id == userDTO.Id)
                    {
                        currentUserProfile = new UserProfile(user.ToArray()[i].Id, gamesId);
                    }

                    profiles.Add(new UserProfile(user.ToArray()[i].Id, gamesId));
                }

                var simiarity2 = new JaccardSimilarity();
                var engine2    = new CollaborativeFiltering();

                var results2 = engine.recommend(profiles, simiarity, currentUserProfile);

                var games2 = _unitOfWork.Games.Get(x => results.Any(r => x.Id == r.Key));
                return(_mapper.Map <IEnumerable <GameDTO> >(games3));
            }
            return(_mapper.Map <IEnumerable <GameDTO> >(games3));
        }