public virtual ItemSets <T> MinePatterns(GetCountHandle updateItemSetSupport, GetMinSupportHandle getMinItemSetSupport, IList <T> domain) { ItemSets <T> Fk = new ItemSets <T>(); List <ItemSet <T> > itemsetSup = new List <ItemSet <T> >(); for (int i = 0; i < domain.Count; ++i) { T item = domain[i]; ItemSet <T> itemset = new ItemSet <T>() { item }; itemset.TransactionCount = 0; itemsetSup.Add(itemset); } updateItemSetSupport(itemsetSup); foreach (ItemSet <T> itemset in itemsetSup) { if (itemset.Support >= getMinItemSetSupport(itemset)) { Fk.Add(itemset); } } int k = 1; ItemSets <T> allFrequentItemSets = new ItemSets <T>(); allFrequentItemSets.AddRange(Fk); while (Fk.Count > 0) { ItemSets <T> Fkp1 = new ItemSets <T>(); //do self-join for (int i = 0; i < Fk.Count; ++i) { for (int j = 0; j < Fk.Count; ++j) { if (i == j) { continue; } bool canJoin = true; for (int l = 0; l < k - 1; ++l) { if (Fk[i][l].CompareTo(Fk[j][l]) != 0) { canJoin = false; break; } } if (canJoin) { if (CanJoin(Fk[i], Fk[j][k - 1])) { ItemSet <T> c = Fk[i].Clone(); c.Add(Fk[j][k - 1]); Fkp1.Add(c); } } } } updateItemSetSupport(Fkp1); List <ItemSet <T> > fis = new List <ItemSet <T> >(); foreach (ItemSet <T> itemset in Fkp1) { if (itemset.Support >= getMinItemSetSupport(itemset)) { fis.Add(itemset); } } allFrequentItemSets.AddRange(fis); Fk.Clear(); Fk.AddRange(fis); k++; } return(allFrequentItemSets); }
public virtual ItemSets <T> MinePatterns(GetCountHandle UpdateItemSetSupport, double minSup, IList <T> domain) { return(MinePatterns(UpdateItemSetSupport, (itemset) => { return minSup; }, domain)); }