Apriori算法的实现

  1. 相关知识点
  2. Apriori算法:Apriori算法是基于频繁项集的关联规则学习算法,用于发掘数据中项与项之间的关联。算法通过递归地生成候选项集并计算其支持度,最终提取出满足最小支持度的频繁项集。算法的核心是“剪枝”思想,即如果某个项集不是频繁项集,那么它的超集也一定不可能是频繁项集。
  3. 支持度:支持度是衡量项集在数据中出现频率的指标。例如,如果一个商品在100次交易中出现了50次,那么它的支持度就是50/100 = 0.5。支持度是判断项集是否频繁的依据。
  4. 置信度:置信度表示在某个条件下,规则的后件出现的概率。例如,规则 {牛奶} -> {面包} 的置信度表示购买牛奶的人购买面包的概率。它是规则前件和后件共同出现的概率与前件出现的概率之比。
  5. 频繁项集:频繁项集是指在所有交易中,出现频率高于或等于最小支持度的项集。通过频繁项集,我们可以发现数据中经常一起发生的事件。
  6. 关联规则:关联规则通过从频繁项集中生成,描述了数据中不同项之间的依赖关系。其形式为 X -> Y,表示在事务中如果包含项集X,那么也很可能包含项集Y。
  • 实验分析
  1. 数据准备:通过Pandas加载CSV文件,并将数据转换为适用于Apriori算法的事务列表形式。
  2. 生成候选1项集:初始步骤生成候选1项集(C1),每个事务中购买过的商品被转化为一个集合,以便后续生成频繁项集。
  3. 频繁项集筛选:遍历候选项集,计算每个项集在事务数据中出现的频率(支持度)。如果支持度大于或等于设定的最小支持度,则该项集被认为是频繁项集。
  4. 生成候选k项集:从频繁项集生成候选k项集(Ck),通过合并频繁k-1项集中的项集,生成可能的k项集。候选k项集的生成依赖于前一步骤生成的频繁项集。
  5. 迭代计算:重复上述过程,直到没有更多频繁项集可生成。每次迭代都会生成更高阶的候选项集,直到无法找到符合最小支持度的频繁项集。
  6. 生成关联规则:根据频繁项集生成关联规则。通过计算规则的置信度,筛选出满足最小置信度的规则。这些规则可以用于商品推荐、市场分析等实际应用。
  • 实验代码
  • import pandas as pd
    
    # 加载数据集
    data = pd.read_csv("ShopCT.csv")
    transactions = data.iloc[:, 1:].values.tolist()
    
    def create_c1(dataset):
        """生成候选 1-项集 C1"""
        c1 = set()
        for transaction in dataset:
            c1.update([frozenset([item]) for item, val in enumerate(transaction) if val == 1])
        return list(c1)
    
    def create_freq_transaction(dataset, ck, min_support):
        """筛选出满足最小支持度的频繁项集"""
        support_data = {}  # 保存支持度
        freq_transaction = []  # 保存频繁项集
        num_transactions = len(dataset)  # 总事务数
    
        # 遍历候选项集
        for candidate in ck:
            count = sum(1 for transaction in dataset if candidate.issubset(transaction))
            support = count / num_transactions
            support_data[candidate] = support
            if support >= min_support:
                freq_transaction.append(candidate)
    
        return support_data, freq_transaction
    
    def create_ck(freq_transaction):
        """由频繁 k-1 项集生成候选 k 项集"""
        ck = set()
        num_items = len(freq_transaction)
        for i in range(num_items):
            for j in range(i + 1, num_items):
                l1, l2 = list(freq_transaction[i])[:-1], list(freq_transaction[j])[:-1]
                if l1 == l2:  # 公共前缀相同
                    ck.add(freq_transaction[i] | freq_transaction[j])
        return list(ck)
    
    def apriori(dataset, min_support):
        """Apriori 算法主函数"""
        c1 = create_c1(dataset)
        support_data, l1 = create_freq_transaction(dataset, c1, min_support)
        all_freq_transaction = [l1]
    
        while all_freq_transaction[-1]:  # 递归生成频繁项集
            ck = create_ck(all_freq_transaction[-1])
            support_data_k, lk = create_freq_transaction(dataset, ck, min_support)
            support_data.update(support_data_k)  # 更新支持度数据
            all_freq_transaction.append(lk)
    
        return support_data, all_freq_transaction[:-1]  # 去掉最后一次的空集
    
    def create_rules(support_data, freq_transactions, min_conf):
        """根据频繁项集生成关联规则"""
        rules = []
        for i in range(1, len(freq_transactions)):  # 从频繁 2-项集开始
            for freq_set in freq_transactions[i]:
                subsets = list(freq_set)
                for subset in subsets:
                    remain = freq_set - frozenset([subset])
                    if remain:
                        confidence = support_data[freq_set] / support_data[frozenset([subset])]
                        if confidence >= min_conf:
                            rules.append((frozenset([subset]), remain, confidence))
        return rules
    
    # 设置最小支持度和置信度
    min_support = 0.5
    min_conf = 0.7
    
    # 生成频繁项集
    support_data, all_freq_transaction = apriori(transactions, min_support)
    print("所有频繁项集:", all_freq_transaction)
    
    # 生成关联规则
    rules = create_rules(support_data, all_freq_transaction, min_conf)
    for rule in rules:
        print(f"规则: {rule[0]} -> {rule[1]},置信度: {rule[2]:.2f}")
    
    

  • 运行截图
  • 实验总结
  • Apriori算法能够有效地挖掘出频繁项集,并基于这些频繁项集生成关联规则,帮助我们发现数据中潜在的关联关系。实验中最有意义的部分是调节最小支持度和置信度参数,这直接影响最终结果的质量。
  • 关联关系。实验中最有意义的部分是调节最小支持度和置信度参数,这直接影响最终结果的质量。在实际应用中,Apriori算法能够为商品推荐、市场分析等提供有价值的数据支持。不过,算法在处理大规模数据时会遇到效率瓶颈,频繁项集的生成需要大量计算和存储,因此在大数据环境下可能需要优化。
  • 总的来说,尽管Apriori算法简单易懂,但要在实际项目中应用它,需要注意性能优化和参数调整。
  • 出现的问题:

  • 数据读取问题:在读取CSV文件时,数据有时包含缺失值或格式不统一,导致程序无法正确加载。
  • 内存占用过高:频繁项集生成过程中,数据量大时内存消耗很高。
  • 解决方案(列出遇到的问题和解决办法,列出没有解决的问题)

  • 数据读取问题:使用pd.read_csv()时加上na_values参数处理缺失值,或者利用dropna()清理数据,确保数据格式一致。
  • 内存占用过高:通过调整最小支持度,减少候选项集的数量,优化内存使用;或者将数据分批处理,分步计算频繁项集,避免一次性加载所有数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值