private Apriori GetNextItemset() { Apriori retObj = new Apriori(K + 1); retObj.GetCandidateSet(this); // this扩展到retObj的候选项集 retObj.CalSupCount(); return(retObj); }
static public List <Apriori> GetAllSets() { List <Apriori> allSets = new List <Apriori>(); Apriori set = new Apriori(1); set.GetFirstItemset(); while (set.freqSet.freqSet.Count > 0) { Console.WriteLine("频繁" + set.K + "项集个数:" + set.freqSet.freqSet.Count); allSets.Add(set); set = set.GetNextItemset(); } return(allSets); }
private void GetCandidateSet(Apriori SrcSet) { // 组合得到K+1集 // 组合方法是两个项0~k-2的元素相等的话,那么就能产生新项{0~k-2,第一项k-1,第二项k-1} // 找出频繁项集内的两个项尝试组合 for (int i = 0; i < SrcSet.freqSet.freqSet.Count; ++i) { for (int j = i + 1; j < SrcSet.freqSet.freqSet.Count; ++j) { // 对于每个频繁项集内的元素 for (int k = 0; k < SrcSet.K; ++k) { // 如果两个项第k个元素相等 if (SrcSet.freqSet.freqSet[i][k] != SrcSet.freqSet.freqSet[j][k]) { // 如果k不是最后一个,直接跳过 if (k != SrcSet.K - 1) { break; } else { // 组合的结果unit List <int> unit = new List <int>(); // 组合生成候选项集的项 for (int g = 0; g < SrcSet.K + 1; ++g) { if (g != SrcSet.K) { unit.Add(SrcSet.freqSet.freqSet[i][g]); } else { unit.Add(SrcSet.freqSet.freqSet[j][g - 1]); } } if (!SrcSet.IsInFreq(unit)) { freqSet.freqSet.Add(unit); freqSet.supCount.Add(0); } } } } } } }
static void AP(string inPath, int useMinSup) { // 设置最小支持度 Apriori.minSup = useMinSup; // 求得频繁项集 DateTime time1 = DateTime.Now; List <Apriori> allSets = Apriori.GetAllSets(); DateTime time2 = DateTime.Now; string a = "花费时间:" + Environment.NewLine + "分钟:" + (time2 - time1).TotalMinutes.ToString() + Environment.NewLine + "秒:" + (time2 - time1).TotalSeconds.ToString() + Environment.NewLine; // 写入文件 string aprioriOutPath = inPath.Substring(0, inPath.LastIndexOf(@".")) + "_minsup_" + useMinSup.ToString() + @".txt"; DataHelper.WriteToFile(aprioriOutPath, allSets); // 展示支持度最高的频繁项集 Apriori.ShowMaxSup(allSets); Console.Write(a); }