コード例 #1
0
ファイル: FPGrowth.cs プロジェクト: LaurentB1995/FP-Growth
 public FPGrowth(List <Transaction> dataset, double support)
 {
     dataSet    = dataset;
     tree       = new FPTree();
     patterns   = new List <ItemSet>();
     minSupport = support;
 }
コード例 #2
0
ファイル: FPTree.cs プロジェクト: LaurentB1995/FP-Growth
        public List <ItemSet> MinePatterns(Dictionary <string, int> supports, double support)
        {
            patterns = new List <ItemSet>();
            foreach (var supp in supports) //add all frequent 1 item sets
            {
                patterns.Add(new ItemSet(new string[] { supp.Key }, supp.Value));
            }

            var           _supp    = supports.Keys.Reverse();
            List <string> usedKeys = new List <string>();

            foreach (string key in _supp)
            {
                usedKeys.Add(key);
                List <ItemSet> freqByKey = new List <ItemSet>();
                MinePatterns(rootNode, key, support, freqByKey);
                Dictionary <string, double> FList = GenerateFList(freqByKey, key, support);
                List <ItemSet> twoItemSets        = new List <ItemSet>();
                FList = FList.OrderByDescending(kv => kv.Value).Reverse().ToDictionary(kv => kv.Key, kv => kv.Value);
                foreach (var kvpair in FList)
                {
                    ItemSet its = new ItemSet(new string[] { key, kvpair.Key }, kvpair.Value); //add frequent 2 item sets containing string key
                    twoItemSets.Add(its);
                    patterns.Add(its);
                }

                FPTree subTree = BuildSubTree(freqByKey, key, support);
                foreach (var twoItemSet in twoItemSets) //if more then 1 element in FLISt --> candidate 3+ ItemSet
                {
                    string itskey = twoItemSet.Items.ToList()[1];

                    var itsval = twoItemSet.Support;

                    var subFreqByKey = new List <ItemSet>();
                    MinePatterns(subTree.rootNode, itskey, support, subFreqByKey);
                    var itsFList = GenerateFList(subFreqByKey, itskey, support);

                    var _FList = new Dictionary <string, double>(FList);
                    foreach (string k in usedKeys) //remove combinations where keys are already used so there's no duplicates
                    {
                        if (itsFList.ContainsKey(k))
                        {
                            itsFList.Remove(k);
                        }
                    }
                    MineLonger(twoItemSet.Items, support, itsFList, subFreqByKey); // Mine longer sets containing this 2 item set (recursive)
                }
            }

            return(patterns.Where(p => p.Items.Count() > 0).ToList());
        }
コード例 #3
0
ファイル: FPTree.cs プロジェクト: LaurentB1995/FP-Growth
 void MineLonger(IEnumerable <string> previous, double minSupport, Dictionary <string, double> subFList, List <ItemSet> SubFreqKey)
 {
     foreach (var kvpair in subFList.Reverse())
     {
         var items = previous.ToList();
         items.Add(kvpair.Key); // add all (n+1)-itemsets containing previous and where n = previous.Count
         ItemSet its = new ItemSet(items, kvpair.Value);
         if (its.Support >= minSupport)
         {
             patterns.Add(its);
         }
     }
     foreach (var kvpair in subFList.Reverse())
     {
         var items = previous.ToList();
         items.Add(kvpair.Key);
         List <ItemSet> subFreqByKey = new List <ItemSet>();
         FPTree         subsubTree   = BuildSubTree(SubFreqKey, items[items.Count - 2], minSupport);
         MinePatterns(subsubTree.rootNode, kvpair.Key, minSupport, subFreqByKey);
         var _subFList = GenerateFList(subFreqByKey, kvpair.Key, minSupport); //create new FList for newly added pattern
         MineLonger(items, minSupport, _subFList, subFreqByKey);
     }
 }