基于h-confidence剪枝的Apriori算法
摘要
当数据集存在倾斜支持度分布时,基于支持度剪枝的Apriori算法无法很好的提取频繁项集,这时需要根据h-confidence进行剪枝。
倾斜支持度分布
一个倾斜支持度分布的例子:
基于支持度剪枝会产出如下问题:
设定过高的支持度阈值会忽略掉一些有趣的规则;
设定过高的支持度阈值会导致:过高的计算成本;会提取出交叉支持模式。
交叉支持模式的定义如下:
为何支持度和置信度失效
考虑如下数据集:
在这样的数据集支持度是无效的:
置信度也是无效的:
如何解决
Python实现
给出数据集:
data = [['a', 'c', 'd'], ['b', 'c', 'e'], ['a', 'b', 'c', 'e'], ['b', 'e']]
生成候选1-项集并计算候选1-项集的支持度计数
# 生成候选1-项集
def createC1(data):
c1 = []
for task in data:
for item in task:
if [item] not in c1:
c1.append([item])
# 排序是因为之后生产频繁k-项集是采用F(k-1)*F(k-1)方法
c1.sort()
# frozenset()返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
return list(map(frozenset, c1))
C1 = createC1(data)
# 计算1-项集的支持度计数
count_c1 = {
}
for task in data:
for item in C1:
if item.issubset(task):
count_c1[item] = count_c1.get(item, 0) + 1
# 排序是为了减少查询次数
count_c1 = dict(sorted(count_c1.items(), key=lambda kv:(kv[1], kv[0]), reverse=True))
print(count_c1)
{
frozenset({
'c'}): 3,
frozenset({
'b'}): 3,
frozenset({
'e'}): 3,
frozenset({
'a'}): 2,
frozenset({
'd'}): 1}
基于全置信度剪枝生成候选2-项集
# 全置信度剪枝适用于倾斜支持度分布的数据集
# 在生成候选2-项集时无需提取频繁1-项集直接根据候选1-项集提取即可
def scanData(data, C_k, h_c, count_c1):
# 计算候选项集的支持度计数
ssCnt = {
}
for task in data:
for can in C_k:
if can.issubset(task):
ssCnt[can] = ssCnt.get(can, 0) + 1
# 计算候选项集的全置信度
retlist = []
Fk = {
}
for key in ssCnt.keys():
for item in count_c1.keys(