Beispiel #1
0
        public static ItemsetCollection DoApriori(ItemsetCollection db, double supportThreshold)
        {
            Itemset           I  = db.GetUniqueItems();
            ItemsetCollection L  = new ItemsetCollection(); //resultant large itemsets
            ItemsetCollection Li = new ItemsetCollection(); //large itemset in each iteration
            ItemsetCollection Ci = new ItemsetCollection(); //pruned itemset in each iteration

            //first iteration (1-item itemsets)
            foreach (int item in I)
            {
                Ci.Add(new Itemset()
                {
                    item
                });
            }

            //next iterations
            int k = 2;

            while (Ci.Count != 0)
            {
                //set Li from Ci (pruning)
                Li.Clear();
                foreach (Itemset itemset in Ci)
                {
                    itemset.Support = db.FindSupport(itemset);
                    if (itemset.Support >= supportThreshold)
                    {
                        Li.Add(itemset);
                        L.Add(itemset);
                    }
                }

                //set Ci for next iteration (find supersets of Li)
                Ci.Clear();
                Ci.AddRange(Bit.FindSubsets(Li.GetUniqueItems(), k)); //get k-item subsets
                k += 1;
            }

            return(L);
        }
Beispiel #2
0
        public static ItemsetCollection DoAprioriNew(ItemsetCollection db, double supportThreshold)
        {
            //Itemset I = db.GetUniqueItems();
            ItemsetCollection Fre = new ItemsetCollection(); //List of Items > support
            ItemsetCollection L   = new ItemsetCollection(); //resultant large itemsets
            ItemsetCollection T   = new ItemsetCollection(); //frequent items

            //item > support
            Itemset I = db.GetUniqueItems();

            foreach (int item in I)
            {
                Itemset itemset = new Itemset()
                {
                    item
                };
                itemset.Support = db.FindSupport(itemset);
                if (itemset.Support >= supportThreshold)
                {
                    Fre.Add(itemset);
                }
            }
            ItemsetCollection subsets = Bit.FindSubsets(Fre.GetUniqueItems(), 0); //get all subsets

            //Dictionary<Itemset, int> subsetsDic = subsets.Select((x, i) => new {x = x, i = 0 }).ToDictionary(k => k.x,k=>k.i);

            //frequent items
            foreach (Itemset itemdata in db)
            {
                Itemset itemset = new Itemset();
                foreach (Itemset itemFre in Fre)
                {
                    if (itemdata.Contains(itemFre[0]))
                    {
                        itemset.Add(itemFre[0]);
                    }
                }
                if (itemset.Count > 0)
                {
                    T.Add(itemset);
                    foreach (Itemset items in subsets)
                    {
                        if (itemset.Contains(items))
                        {
                            items.Support++;
                        }
                    }
                }
            }

            foreach (Itemset items in subsets)
            {
                if (items.Count > 0)
                {
                    items.Support = (items.Support / (double)db.Count) * 100.0;
                    if (items.Support >= supportThreshold)
                    {
                        L.Add(items);
                    }
                }
            }
            return(L);
        }
Beispiel #3
0
        public static ItemsetCollection DoFPGrowthParallel(ItemsetCollection db, double supportThreshold)
        {
            ItemsetCollection        Fre       = new ItemsetCollection(); //List of Items > support
            ItemsetCollection        T         = new ItemsetCollection(); //frequent items
            List <ItemsetCollection> P         = new List <ItemsetCollection>();
            ItemsetCollection        FPTreeCon = new ItemsetCollection(); //Conditional FP-Tree

            //item > support
            //Itemset I = db.GetUniqueItems();
            //foreach (string item in I)
            //{
            //    Itemset itemset = new Itemset() { item };
            //    itemset.Support = db.FindSupport(itemset);
            //    if (itemset.Support >= supportThreshold)
            //    {
            //        Fre.Add(itemset);
            //    }
            //}
            //// sort item
            //Fre.Sort(delegate (Itemset x, Itemset y)
            //{
            //    if (x.Support > y.Support) return -1;
            //    else if (x.Support < y.Support)
            //        return 1;
            //    else return 0;
            //});
            ////Fre = ParallelFre(db, supportThreshold);
            ////frequent items
            //foreach (Itemset itemdata in db)
            //{
            //    Itemset itemset = new Itemset();
            //    foreach (Itemset itemFre in Fre)
            //    {
            //        if (itemdata.Contains(itemFre[0]))
            //        {
            //            itemset.Add(itemFre[0]);
            //        }
            //    }
            //    T.Add(itemset);
            //}

            T = ParallelFPGrowth(db, supportThreshold, ref Fre);
            // create FP Tree
            FPTree tree = CreateTree(T);

            // Conditional Patern Bases
            foreach (Itemset itemset in Fre)
            {
                ItemsetCollection itemsetCollection = new ItemsetCollection();
                for (int j = 0; j < tree.countNode; j++)
                {
                    var node = tree.arrayNode[j];
                    if (node.itemName.Equals(itemset[0]) && !node.visited)
                    {
                        node.visited = true;
                        var nodeparent = node.nodeParent;
                        while (nodeparent.itemName > -1)
                        {
                            int index = itemsetCollection.FindIndex(nodeparent.itemName);
                            if (index > -1)
                            {
                                itemsetCollection[index].Support += node.count;
                            }
                            else
                            {
                                Itemset item = new Itemset();
                                item.Support = node.count;
                                item.Add(nodeparent.itemName);
                                itemsetCollection.Add(item);
                            }
                            nodeparent = nodeparent.nodeParent;
                        }
                    }
                }
                P.Add(itemsetCollection);
            }
            // Conditional FP-Tree
            for (int i = 0; i < P.Count; i++)
            {
                ItemsetCollection itemsetCollection = new ItemsetCollection();
                //itemsetCollection.Add(Fre[i]); //hoán vị sau
                foreach (var item in P[i])
                {
                    if (db.Support(item) >= supportThreshold)
                    {
                        itemsetCollection.Add(item);
                    }
                }
                ItemsetCollection subsets = Bit.FindSubsets(itemsetCollection.GetUniqueItems(), 0); //get all subsets
                foreach (Itemset items in subsets)
                {
                    items.Add(Fre[i][0]);
                    items.Support = db.FindSupport(items);
                    if (items.Support >= supportThreshold)
                    {
                        FPTreeCon.Add(items);
                    }
                }
            }
            return(FPTreeCon);
        }