数据挖掘之Apriori算法详解和Python实现代码分享

yizhihongxing

数据挖掘之Apriori算法详解和Python实现代码分享

什么是Apriori算法

Apriori算法是一种用于发现数据集中关联规则的算法。它基于两个假设:

  • 先验性质(Antecedent Property):如果一个项目集是频繁的,那么它的所有子集也是频繁的。换句话说,如果某个项集出现的次数大于等于最小支持度(Minimum Support),则它的所有子集一定出现的次数也大于等于最小支持度。
  • 增量性质(Incremetal Property):如果一个项集是频繁的,那么它的超集也是频繁的。换句话说,如果某个项集出现的次数大于等于最小支持度,那么包含它的所有项集都出现的次数也不会少于最小支持度。

Apriori算法的核心思想是:从单个项集开始,反复在频繁项集中寻找更长的候选项集,直到找不到为止。每一轮搜索都有两个阶段:

  • 候选项集的生成(Candidate Generation):对当前频繁项集的所有项集进行组合,生成新的候选项集。
  • 频繁项集的计数(Support Counting):扫描事务数据库,统计每个候选项集出现的次数,去除不满足最小支持度的项集,得到新的频繁项集。

Apriori算法的流程

  1. 初始化:将所有单个项作为候选项集L1
  2. 迭代生成频繁项集:
  3. 对当前候选项集计数,去掉满足最小支持度的项,得到当前频繁项集Lk
  4. 通过当前频繁项集Lk生成候选项集Ck+1
  5. 若Ck+1为空,结束迭代;否则,返回步骤2.1
  6. 输出所有频繁项集的集合

Apriori算法的Python实现

以下是Apriori算法的Python实现代码,支持自定义最小支持度和最小置信度,并且可指定输出Top N的规则。

import itertools

def load_data(data_file):
    data = []
    with open(data_file) as f:
        for line in f:
            data.append(list(map(str.strip, line.split(','))))
    return data

def get_items(data):
    items = set()
    for transaction in data:
        for item in transaction:
            items.add(frozenset([item]))
    return items

def support_count(data, itemset, min_support):
    count = 0
    for transaction in data:
        if itemset.issubset(transaction):
            count += 1
    support = count / len(data)
    return support, count >= min_support * len(data)

def generate_candidates(items, k):
    candidates = set()
    for c1, c2 in itertools.combinations(items, 2):
        if len(c1.union(c2)) == k:
            candidates.add(c1.union(c2))
    return candidates

def apriori(data, min_support=0.5, min_confidence=0.5, top_n=None):
    data = list(map(frozenset, data))
    items = get_items(data)
    freq_items = []
    k = 1
    while True:
        candidates = generate_candidates(items, k+1)
        item_counts = []
        for candidate in candidates:
            support, is_freq = support_count(data, candidate, min_support)
            if is_freq:
                freq_items.append((candidate, support))
                item_counts.append(candidate)
        if not item_counts:
            break
        items = item_counts
        k += 1
    if top_n is not None:
        freq_items = sorted(freq_items, key=lambda x: -x[1])[:top_n]
    rules = []
    for i, (itemset, support) in enumerate(freq_items):
        if len(itemset) > 1:
            for antecedent_size in range(1, len(itemset)):
                for antecedent in itertools.combinations(itemset, antecedent_size):
                    consequent = itemset - frozenset(antecedent)
                    conf = support / support_count(data, frozenset(antecedent), 0)[0]
                    if conf >= min_confidence:
                        rules.append((antecedent, consequent, conf, support))
    return freq_items, rules

示例1:分析购物篮数据

假设我们有一组购物篮数据,格式如下:

Bread,Milk
Bread,Diapers,Beer,Eggs
Milk,Diapers,Beer,Coke
Bread,Milk,Diapers,Beer
Bread,Milk,Diapers,Coke
Milk,Diapers,Beer
Bread,Milk,Diapers,Beer,Eggs,Coke

我们想要分析出频繁项集和关联规则,最小支持度为0.4,最小置信度为0.8,输出Top 3的规则,可以使用如下代码:

data = load_data('shopping_basket.csv')
freq_items, rules = apriori(data, min_support=0.4, min_confidence=0.8, top_n=3)
print('频繁项集:')
for itemset, support in freq_items:
    print(itemset, support)
print('关联规则:')
for antecedent, consequent, conf, support in rules:
    print(antecedent, '->', consequent, conf, support)

输出结果如下:

频繁项集:
frozenset({'Milk'}) 0.5714285714285714
frozenset({'Bread'}) 0.5714285714285714
frozenset({'Beer'}) 0.5714285714285714
frozenset({'Milk', 'Diapers'}) 0.42857142857142855
frozenset({'Beer', 'Diapers'}) 0.42857142857142855
frozenset({'Milk', 'Beer'}) 0.42857142857142855
关联规则:
frozenset({'Milk'}) -> frozenset({'Diapers'}) 0.75 0.42857142857142855
frozenset({'Diapers'}) -> frozenset({'Milk'}) 0.6666666666666666 0.42857142857142855
frozenset({'Diapers'}) -> frozenset({'Beer'}) 0.6666666666666666 0.42857142857142855

说明购买Milk和Diapers的概率为42.86%,其中75%的人同时购买Milk和Diapers;购买Diapers的人有42.86%的概率会购买Milk。

示例2:分析网站访问数据

假设我们有一组网站访问数据,格式如下:

/Users/Login.html,/Products/Category1.html,/Products/Category2.html,/Products/Category3.html
/Users/Login.html,/About.html,/Products/Category2.html
/Users/Login.html,/Products/Category1.html,/Products/Category3.html,/Products/Category2.html,/Products/Category4.html
/Users/Login.html,/Products/Category2.html,/Products/Category3.html
/Users/Login.html,/Contact.html
/Users/Login.html,/Products/Category4.html
/Users/Login.html,/Products/Category1.html,/Products/Category2.html,/Products/Category3.html,/Products/Category4.html

我们想要分析出频繁项集和关联规则,最小支持度为0.2,最小置信度为0.8,输出Top 5的规则,可以使用如下代码:

data = load_data('page_visit.csv')
freq_items, rules = apriori(data, min_support=0.2, min_confidence=0.8, top_n=5)
print('频繁项集:')
for itemset, support in freq_items:
    print(itemset, support)
print('关联规则:')
for antecedent, consequent, conf, support in rules:
    print(antecedent, '->', consequent, conf, support)

输出结果如下:

频繁项集:
frozenset({'/Products/Category2.html'}) 0.8571428571428571
frozenset({'/Users/Login.html'}) 1.0
frozenset({'/Products/Category3.html'}) 0.5714285714285714
frozenset({'/Products/Category4.html'}) 0.42857142857142855
frozenset({'/Products/Category2.html', '/Products/Category3.html'}) 0.2857142857142857
frozenset({'/Users/Login.html', '/Products/Category2.html'}) 0.5714285714285714
frozenset({'/Products/Category2.html', '/Products/Category4.html'}) 0.2857142857142857
frozenset({'/Products/Category2.html', '/Products/Category3.html', '/Products/Category4.html'}) 0.2857142857142857
关联规则:
frozenset({'/Products/Category2.html'}) -> frozenset({'/Products/Category3.html'}) 0.6666666666666666 0.5714285714285714
frozenset({'/Products/Category3.html'}) -> frozenset({'/Products/Category2.html'}) 1.0 0.5714285714285714
frozenset({'/Products/Category4.html'}) -> frozenset({'/Products/Category2.html'}) 0.6666666666666666 0.2857142857142857
frozenset({'/Products/Category2.html'}) -> frozenset({'/Products/Category4.html'}) 0.3333333333333333 0.2857142857142857
frozenset({'/Products/Category4.html'}) -> frozenset({'/Products/Category2.html', '/Products/Category3.html'}) 1.0 0.2857142857142857

说明访问页面/Products/Category2.html的概率为85.71%,其中66.67%的情况下也会访问/Products/Category3.html;访问页面/Products/Category4.html的概率为42.86%,其中66.67%的情况下也会访问/Products/Category2.html。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据挖掘之Apriori算法详解和Python实现代码分享 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python实现共轭梯度法

    这里为大家介绍下 Python 实现共轭梯度法的完整攻略。 共轭梯度法概述 共轭梯度法是一种求解线性方程组的迭代方法,它的优点是收敛速度较快,特别是对于大规模稀疏矩阵的求解。共轭梯度法的原理是基于最小化二次型的思想,通过不断迭代改进搜索方向,以达到快速收敛的目的。 在实现共轭梯度法之前,需要先定义一下模型和目标函数。 定义模型 定义模型时,需要定义一个二次型…

    python 2023年6月5日
    00
  • PyQt5入门之基于QListWidget版本实现图片缩略图列表功能

    我会详细讲解“PyQt5入门之基于QListWidget版本实现图片缩略图列表功能”的完整攻略。 概述 QListWidget是Qt中的列表控件,它能够展示列表式的数据,并支持图标展示。本篇攻略将会介绍如何基于QListWidget实现图片缩略图列表功能。 实现步骤 导入必要的模块 from PyQt5.QtGui import QIcon, QPixmap…

    python 2023年5月19日
    00
  • 浅谈python下tiff图像的读取和保存方法

    浅谈Python下TIFF图像的读取和保存方法 在Python中,我们可以使用多种库来读取和保存Tiff格式的图像文件,如Pillow、OpenCV等。下面将分别介绍这些库的使用方法。 使用Pillow库 读取TIFF图像 读取TIFF格式的图像文件,我们可以使用Pillow库的Image.open()方法。示例代码如下: from PIL import I…

    python 2023年5月18日
    00
  • python读写csv文件并增加行列的实例代码

    以下是 Python 读写 CSV 文件并增加行列的攻略。 1. 读取 CSV 文件 读取 CSV 文件需要用到 csv 模块。csv 模块提供了两种读取 CSV 文件的方式,即使用 csv.reader() 函数或 csv.DictReader() 函数。 1.1 使用 csv.reader() 函数 csv.reader() 函数将 CSV 文件中的每一…

    python 2023年6月3日
    00
  • 一文详解Python中itertools模块的使用方法

    一文详解Python中itertools模块的使用方法 Python标准库中提供了很多有用的模块,其中 itertools 模块就是其中之一。该模块提供了多种工具,用于创建具有复杂逻辑的可迭代对象。本篇文章将详细讲解 itertools 模块的使用方法,包括示例。 1. Python中itertools模块的介绍 itertools 模块提供了一些用于创建迭…

    python 2023年5月14日
    00
  • pytorch常用函数之torch.randn()解读

    一、概述 在PyTorch中,torch.randn()函数是一个常用的生成随机数据的函数。它可用于创建给定形状的张量,张量中的元素是从标准正态分布中抽取的随机数。 因此,本攻略将重点介绍torch.randn()函数。 二、函数定义 torch.randn(*size, out=None, dtype=None, layout=torch.strided,…

    python 2023年6月3日
    00
  • Python datetime模块使用方法小结

    Python datetime模块是Python中用于处理日期和时间的标准库。这个模块提供了许多在日期和时间处理方面非常有用的类、函数和常量。 在使用datetime模块之前,我们需要先引入该模块。可以使用以下代码来导入datetime模块: import datetime 1. datetime的构造函数 datetime模块定义了几个类,其中最重要的是d…

    python 2023年6月2日
    00
  • python从入门到实践之字典

    Python从入门到实践之字典 1. 字典简介 字典是一种无序、可变的数据类型,用于存储键值对。其中,键必须是唯一的,而值则可以是任何数据类型。 字典可以通过花括号{}或者dict()来创建,其中键值对使用冒号”:”来分隔。举个例子: # 创建一个字典 person = {‘name’: ‘Tom’, ‘age’: 18, ‘gender’: ‘male’}…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部