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 def apriori(dataSet, minSupport=0.2): # 前3条语句是对计算查找单个元素中的频繁项集 C1 = createC1(dataSet) D = list(map(set, dataSet)) # 使用list()转换为列表 L1, supportData = calSupport(D, C1, minSupport) L = [L1] # 加列表框,使得1项集为一个单独元素 k = 2 while (len(L[k - 2]) > 0): # 是否还有候选集 Ck = aprioriGen(L[k - 2], k) Lk, supK = scanD(D, Ck, minSupport) # scan DB to get Lk supportData.update(supK) # 把supk的键值对添加到supportData里 L.append(Lk) # L最后一个值为空集 k += 1 del L[-1] # 删除最后一个空集 return L, supportData # L为频繁项集,为一个列表,1,2,3项集分别为一个元素 # 生成集合的所有子集标注解释
时间: 2024-02-10 09:20:43 浏览: 55
这段代码实现了 Apriori 算法中的生成候选 k-项集的函数 aprioriGen。具体来说,函数输入参数包括:
- Lk:频繁 k-1 项集;
- k:项集的大小。
函数输出参数包括:
- retList:所有可能的频繁 k-项集。
代码主要分为两个部分:
首先,使用两重循环遍历频繁 k-1 项集 Lk 中的每两个不同的项集,对它们进行两两组合,得到一个新的 k-项集。具体来说,对于两个 k-1 项集 L1 和 L2,如果它们的前 k-2 个项都相等,则可以将它们合并成一个新的 k-项集。这个过程可以通过将 L1 和 L2 转换为列表后,取前 k-2 个元素进行比较来实现。
其次,对于每个新的 k-项集,进行剪枝操作。具体来说,对于一个 k-项集 a,我们可以取出它的所有 k-1 项子集 b(即将 a 中的某个元素去掉后,得到的所有 k-1 项集),并判断它们是否都是频繁 k-1 项集 Lk-1 的子集。如果是,则保留该 k-项集,否则删除。这个过程可以通过将 a 转换为 frozenset 集合,再从 a 中取出每个元素,依次从 a 中剔除该元素,并加入到 b 中来实现。
最后,将所有保留下来的 k-项集加入到 retList 中,并返回。
另外,代码中还提供了生成集合的所有子集的标注解释,但是这里没有给出具体实现的代码。
相关问题
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标记注释
这段代码是对Apriori算法的改进,主要是在aprioriGen函数中进行了剪枝。在生成候选K项集的过程中,先将两个频繁K-1项集进行组合,判断它们前K-1项是否相等,如果相等则进行剪枝,只保留其中一个项集。具体来说,对于这两个频繁K-1项集,取它们的并集生成一个新的K项集,然后对这个K项集的所有K-1项子集进行判断,如果它们都是频繁K-1项集中的子集,则说明这个新的K项集也是频繁的,可以保留。这样做可以减少生成候选K项集的数量,提高算法效率。
使用python生成用Apriori算法挖掘频繁项集的代码
可以的,以下是用Python实现Apriori算法来挖掘频繁项集的简单代码:
```python
def loadDataSet():
return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
def scanD(D, Ck, minSupport):
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not in ssCnt: ssCnt[can]=1
else: ssCnt[can] += 1
numItems = float(len(D))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key]/numItems
if support >= minSupport:
retList.insert(0,key)
supportData[key] = support
return retList, 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:
retList.append(Lk[i] | Lk[j])
return retList
def apriori(dataSet, minSupport = 0.5):
C1 = createC1(dataSet)
D = list(map(set, dataSet))
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
```
希望对你有所帮助!~
阅读全文