public FPGrowth(List <Transaction> dataset, double support) { dataSet = dataset; tree = new FPTree(); patterns = new List <ItemSet>(); minSupport = support; }
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()); }
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); } }