数据挖掘之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的正则表达式模块–re来实现,具体步骤如下: 1.导入re模块 使用re模块分析字符串需要先导入re模块: import re 2.使用re.split()方法 re模块中的split()方法可以实现针对限定的分隔符分割字符串,但如果希望使用不定数量或不同分隔符进行切割,可以将一个正则表达式作为参数传入spli…

    python 2023年6月3日
    00
  • Python3利用print输出带颜色的彩色字体示例代码

    下面我来分享一下“Python3利用print输出带颜色的彩色字体”的完整攻略。 什么是彩色字体? 彩色字体是指可以通过指定字体颜色来显示不同的文本效果,如红色、绿色、蓝色等。 利用print输出带颜色的彩色字体的方法 我们可以使用ANSI转义码(escape sequences)来给Python中的字符串设置颜色。ANSI转义码是控制终端输出的一种方式。下…

    python 2023年6月5日
    00
  • 如何使用Tkinter进行窗口的管理与设置

    使用Tkinter进行窗口的管理和设置,主要包括以下步骤: 导入Tkinter模块 创建窗口 设置窗口属性 添加控件 运行窗口 下面的两个示例说明如何使用Tkinter进行窗口的创建、控件的添加和设置窗口属性。示例代码均为Python 3.x语法。 示例一:创建一个简单的窗口并添加标签控件 import tkinter as tk # 创建窗口 root =…

    python 2023年6月13日
    00
  • python数字图像处理之边缘轮廓检测

    Python数字图像处理之边缘轮廓检测攻略 概述 边缘轮廓检测是数字图像处理中常用的技术之一,广泛应用于医疗、安防、工业等各个领域。本篇攻略将会向读者详细介绍Python数字图像处理中边缘轮廓检测的实现方法。 环境准备 本篇攻略使用到的Python库包括:numpy, cv2。请确保在计算机上已经安装了相应的库。 import numpy as np imp…

    python 2023年6月6日
    00
  • Python+Pygame实现代码雨动画效果

    下面是 “Python+Pygame实现代码雨动画效果”的完整攻略。 示例一:创建Pygame窗口 首先,我们需要在我们的Python脚本中导入Pygame模块并初始化,创建一个Pygame窗口: import pygame pygame.init() # 初始化Pygame # 设置窗口大小 size = (800, 600) screen = pygam…

    python 2023年6月3日
    00
  • 报错No module named numpy问题的解决办法

    当您在Python项目中使用了numpy库但出现了“Nomodulenamednumpy”错误时,这可能是因为未成功安装numpy库或项目所使用的Python解释器无法找到numpy库。 以下是解决此问题的几种方法: 方法一:检查numpy库是否安装 使用pip命令,确认是否已经成功安装numpy库: pip show numpy 如果没有显示numpy的详…

    python 2023年5月13日
    00
  • Python基础学习函数+模块+类

    Python基础学习——函数、模块和类 在Python中,函数、模块和类都是非常重要的基础知识。 函数 函数是一块可重用的代码,它接受输入并返回输出。函数的优点是可以提高代码的可读性和重复利用性。 函数的定义和调用 在Python中,定义函数的语法为: def function_name(parameter1, parameter2, …): # fun…

    python 2023年6月5日
    00
  • python中的subprocess.Popen()使用详解

    以下是“Python中的subprocess.Popen()使用详解”的完整攻略,其中包括了subprocess.Popen()的定义、使用方法、示例说明以及常见问题解决。 Python中的subprocess.Popen()使用详解 subprocess.Popen()的定义 subprocess.Popen()是Python中一个模块,用于在子进中执行外…

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