def calSupport(D, Ck, min_support): dict_sup = {} for i in D: for j in Ck: if j.issubset(i): if not j in dict_sup: dict_sup[j] = 1 else: dict_sup[j] += 1 sumCount = float(len(D)) supportData = {} relist = [] for i in dict_sup: temp_sup = dict_sup[i] / sumCount if temp_sup >= min_support: relist.append(i) # 此处可设置返回全部的支持度数据(或者频繁项集的支持度数据) supportData[i] = temp_sup return relist, supportData # 改进剪枝算法 def aprioriGen(Lk, k): retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i + 1, lenLk): # 两两组合遍历 L1 = list(Lk[i])[:k - 2] L2 = list(Lk[j])[:k - 2] L1.sort() L2.sort() if L1 == L2: # 前k-1项相等,则可相乘,这样可防止重复项出现 # 进行剪枝(a1为k项集中的一个元素,b为它的所有k-1项子集) a = Lk[i] | Lk[j] # a为frozenset()集合 a1 = list(a) b = [] # 遍历取出每一个元素,转换为set,依次从a1中剔除该元素,并加入到b中 for q in range(len(a1)): t = [a1[q]] tt = frozenset(set(a1) - set(t)) b.append(tt) t = 0 for w in b: # 当b(即所有k-1项子集)都是Lk(频繁的)的子集,则保留,否则删除。 if w in Lk: t += 1 if t == len(b): retList.append(b[0] | b[1]) return retList标记注释
时间: 2024-02-10 11:20:43 浏览: 85
这段代码是对Apriori算法的改进,主要是在aprioriGen函数中进行了剪枝。在生成候选K项集的过程中,先将两个频繁K-1项集进行组合,判断它们前K-1项是否相等,如果相等则进行剪枝,只保留其中一个项集。具体来说,对于这两个频繁K-1项集,取它们的并集生成一个新的K项集,然后对这个K项集的所有K-1项子集进行判断,如果它们都是频繁K-1项集中的子集,则说明这个新的K项集也是频繁的,可以保留。这样做可以减少生成候选K项集的数量,提高算法效率。
相关问题
def calSupport(D, Ck, min_support): dict_sup = {} for i in D: for j in Ck: if j.issubset(i): if not j in dict_sup: dict_sup[j] = 1 else: dict_sup[j] += 1 sumCount = float(len(D)) supportData = {} relist = [] for i in dict_sup: temp_sup = dict_sup[i] / sumCount if temp_sup >= min_support: relist.append(i) # 此处可设置返回全部的支持度数据(或者频繁项集的支持度数据) supportData[i] = temp_sup return relist, supportData # 改进剪枝算法标注解释
这段代码实现了 Apriori 算法中的计算支持度的函数。具体来说,函数输入参数包括:
- D:一个数据集,其中每个元素是一个项集(itemset);
- Ck:候选的 k-项集(k-itemset);
- min_support:最小支持度阈值。
函数输出参数包括:
- relist:满足最小支持度阈值的频繁 k-项集;
- supportData:频繁 k-项集的支持度数据。
代码主要分为两个部分:
首先,使用双重循环遍历数据集 D 中的每个项集和候选 k-项集 Ck,找出每个候选 k-项集在数据集 D 中出现的次数。这个过程可以通过判断候选 k-项集是否为某个项集的子集来实现。如果某个候选 k-项集的出现次数大于等于最小支持度阈值,则将其加入 relist 列表,并记录其支持度。
其次,通过计算每个频繁 k-项集在数据集 D 中出现的概率,得到频繁 k-项集的支持度数据。
值得注意的是,这段代码还提供了一些改进剪枝算法的标注解释,但是这里没有给出剪枝算法的具体实现,因此无法对这部分代码进行解释。
阅读全文