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

数据挖掘之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 实现倒排索引的方法” 的完整攻略: 什么是倒排索引 倒排索引(Inverted Index)是一种常用于全文搜索引擎的数据结构。它是一个字符串到文档列表的映射,也就是说,对于一个包含了若干文本的文档集合,我们可以建立一个由每个单词(或者字符)指向包含它的文档列表的索引。 倒排索引可以使检索速度更快,因为我们可以先对查询进行处理,然后只…

    python 2023年6月5日
    00
  • python利用requests库进行接口测试的方法详解

    以下是关于Python利用requests库进行接口测试的方法详解的攻略: Python利用requests库进行接口测试的方法详解 在Python中,使用requests库可以方便地进行接口测试。以下是Python利用requests库进行接口测试的方法详解。 发送HTTP请求 使用requests库发送HTTP请求时,需要使用get或post方法,并指定…

    python 2023年5月14日
    00
  • Python中低维数组填充高维数组的实现

    Python中低维数组填充高维数组的实现可以通过NumPy库中的reshape函数或者newaxis关键字来实现。具体步骤如下: 确定高维数组的维度和形状。 创建低维数组并填充数据。 使用reshape函数将低维数组转换为高维数组。 或者在低维数组中使用newaxis关键字来添加新的维度。 下面是两个示例说明: 示例1:使用reshape函数填充高维数组 i…

    python 2023年6月6日
    00
  • Python 通过pip安装Django详细介绍

    下面给出Python通过pip安装Django的完整攻略,包含以下几个步骤: 步骤一:检查Python是否已经安装 在安装Django之前,我们需要确认Python是否已经安装。可以通过在终端中输入以下命令检查Python是否已经安装: python –version 如果已经安装,则会显示Python的版本号。如果没有显示版本号,需要先安装Python。…

    python 2023年5月14日
    00
  • django项目用higcharts统计最近七天文章点击量

    让我详细讲解一下“Django项目用Highcharts统计最近七天文章点击量”的完整攻略。 1. 安装Highcharts 首先,我们需要在Django项目中安装Highcharts。我们可以在命令行中使用pip安装Highcharts: pip install highcharts 2. 获取文章点击量 获取最近七天文章点击量的方法可以有很多,这里给出两…

    python 2023年6月2日
    00
  • Python解析nginx日志文件

    下面我将详细讲解“Python解析nginx日志文件”的完整攻略。 一、背景 nginx 是一款高性能的 Web 服务器软件,广泛应用于互联网中。而对于 nginx 服务器日志的处理也是非常重要的,通过分析日志可以了解访问量、访问方式、访问区域等信息,这些信息可以帮助我们更好地了解用户需求,优化网站架构,提高用户体验。 二、准备工作 在正式解析 nginx …

    python 2023年6月6日
    00
  • python登陆asp网站页面的实现代码

    Python登陆ASP网站页面的实现代码攻略 在本攻略中,我们将介绍如何使用Python实现登陆ASP网站页面的代码。我们将使用Python的requests库和BeautifulSoup库来实现这个过程。 步骤1:分析网页结构 首先,我们需要分析ASP网站登陆页面的网页结构。我们可以使用Chrome浏览器的开发者工具来查看网页结构。在网页上右键单击,然后选…

    python 2023年5月15日
    00
  • ipython和python区别详解

    IPython和Python区别详解 1. IPython是什么? IPython是一个增强版的Python解释器,可以为用户提供更优秀的交互式编程环境,并且提供了许多高级功能。 IPython可以在终端使用,也可以在Jupyter Notebook中使用。它包含了一些很好的特性,例如: 自动补全 命令历史记录 帮助和文档信息 魔术命令 单元测试 2. IP…

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