首页 > 编程语言 >apriori算法 python实现

apriori算法 python实现

时间:2023-02-16 12:23:18浏览次数:42  
标签:1.0 python items apriori 0.5 项集 item 算法 dataset

from typing import *

from typing import List, Tuple
from itertools import combinations


def loadDataSet():
    return [{1, 2, 4, 5}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}]


def loadCharDataSet():
    return [{ord(x) for x in item} for item in
            [
                list("abde"),
                list("bcd"),
                list("abde"),
                list("acde"),
                list("bcde"),
                list("bde"),
                list("cd"),
                list("abc"),
                list("ade"),
                list("bd"),
            ]
            ]


def get_k_item(data: List[Set[int]], k: int) -> List[Set[int]]:
    """
    找出所有的k项集
    """
    single_element = set([item for items in data for item in items])
    return [
        set(item) for item in combinations(single_element, k)
    ]


def get_one_support_rate(dataset: List[Set[int]], item: Set[int]):
    return sum([1 for dataset_item in dataset if len(item & dataset_item) == len(item)]) / len(dataset)


def get_support_rate(dataset: List[Set[int]], data: List[Set[int]]) -> List[Tuple[tuple, float]]:
    """
    计算给定k项集的支持度
    """
    return [
        (
            tuple(item),
            get_one_support_rate(dataset, item)
        )
        for item in data
    ]


def get_filter_items(data: List[Tuple[tuple, float]], rate: float) -> List[Set[int]]:
    """
    通过支持度,筛选给定的k项集
    """
    return [set(item[0]) for item in data if item[1] >= rate]

def get_item_confidence(items_after):
    result = []
    for max_feq_item in items_after:
        n = len(max_feq_item)
        all_subsets = [list(combinations(max_feq_item, k)) for k in range(1, n)]
        all_subsets = list(set(item) for subset in all_subsets for item in subset)
        li = []
        for subset in all_subsets:
            complement = set(max_feq_item) - subset
            li.append([subset, complement])
        for item in li:
            rate = get_one_support_rate(dataset, item[0] | item[1]) / get_one_support_rate(dataset, item[0])
            item.append(rate)
        result.extend(li)
    return result

def get_filter_relation(data: List[List[Union[dict, dict, float]]], rate: float, is_log=True) -> List[
    List[Union[dict, dict]]]:
    """
    通过支持度,筛选给定的k项集
    """
    relations = [[item[0], item[1]] for item in data if item[2] >= rate]
    if is_log:
        for relation in relations:
            print(f"{relation[0]} -> {relation[1]}")
    return relations
dataset = loadDataSet()
print(f"dataset: {dataset}")
k = 0
MIN_SUPPORT = 0.5
MIN_CONFIDENCE = 0.8
print(f"最小支持度: {MIN_SUPPORT}")
print(f"最小置信度: {MIN_CONFIDENCE}")

items_after = dataset  # 初始化为数据集
while True:
    k += 1
    item_or_not = get_k_item(items_after, k)
    if len(item_or_not) == 0:
        print("结束")
        break
    items = item_or_not
    print(f"候选{k}项集: {items}")
    items_pre = get_support_rate(dataset, items)
    print(f"候选{k}项集的支持度: {items_pre}")
    items_after_or_not = get_filter_items(items_pre, rate=MIN_SUPPORT)
    if len(items_after_or_not) == 0:
        print("结束")
        break
    items_after = items_after_or_not
    print(f"频繁{k}项集: {items_after}")
    relations = get_item_confidence(items_after)
    print(f"关联规则及置信度: {relations}")
    print(f"筛选后的关联规则: ")
    get_filter_relation(relations, rate=MIN_CONFIDENCE, is_log=True)

output:

dataset: [{1, 2, 4, 5}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}]
最小支持度: 0.5
最小置信度: 0.8
候选1项集: [{1}, {2}, {3}, {4}, {5}]
候选1项集的支持度: [((1,), 0.5), ((2,), 1.0), ((3,), 0.5), ((4,), 0.25), ((5,), 1.0)]
频繁1项集: [{1}, {2}, {3}, {5}]
关联规则及置信度: []
筛选后的关联规则: 
候选2项集: [{1, 2}, {1, 3}, {1, 5}, {2, 3}, {2, 5}, {3, 5}]
候选2项集的支持度: [((1, 2), 0.5), ((1, 3), 0.25), ((1, 5), 0.5), ((2, 3), 0.5), ((2, 5), 1.0), ((3, 5), 0.5)]
频繁2项集: [{1, 2}, {1, 5}, {2, 3}, {2, 5}, {3, 5}]
关联规则及置信度: [[{1}, {2}, 1.0], [{2}, {1}, 0.5], [{1}, {5}, 1.0], [{5}, {1}, 0.5], [{2}, {3}, 0.5], [{3}, {2}, 1.0], [{2}, {5}, 1.0], [{5}, {2}, 1.0], [{3}, {5}, 1.0], [{5}, {3}, 0.5]]
筛选后的关联规则: 
{1} -> {2}
{1} -> {5}
{3} -> {2}
{2} -> {5}
{5} -> {2}
{3} -> {5}
候选3项集: [{1, 2, 3}, {1, 2, 5}, {1, 3, 5}, {2, 3, 5}]
候选3项集的支持度: [((1, 2, 3), 0.25), ((1, 2, 5), 0.5), ((1, 3, 5), 0.25), ((2, 3, 5), 0.5)]
频繁3项集: [{1, 2, 5}, {2, 3, 5}]
关联规则及置信度: [[{1}, {2, 5}, 1.0], [{2}, {1, 5}, 0.5], [{5}, {1, 2}, 0.5], [{1, 2}, {5}, 1.0], [{1, 5}, {2}, 1.0], [{2, 5}, {1}, 0.5], [{2}, {3, 5}, 0.5], [{3}, {2, 5}, 1.0], [{5}, {2, 3}, 0.5], [{2, 3}, {5}, 1.0], [{2, 5}, {3}, 0.5], [{3, 5}, {2}, 1.0]]
筛选后的关联规则: 
{1} -> {2, 5}
{1, 2} -> {5}
{1, 5} -> {2}
{3} -> {2, 5}
{2, 3} -> {5}
{3, 5} -> {2}
候选4项集: [{1, 2, 3, 5}]
候选4项集的支持度: [((1, 2, 3, 5), 0.25)]
结束

标签:1.0,python,items,apriori,0.5,项集,item,算法,dataset
From: https://www.cnblogs.com/aminor/p/17126214.html

相关文章

  • 随机森林算法相关研究安装
    Ubuntu中ssh、mysql、anaconda相关安装操作SSH服务安装1.安装ssh服务Ubuntu下安装OpenSSHServer是无比轻松的一件事情,需要的命令只有一条:sudoapt-getinstallopenssh......
  • python数据类型
    python数据类型:Number(数字): int、float、bool、complex(复数)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典)如何查看数据类型:使用type()函数查看数据类型,例......
  • 用Python制作各种用途的二维码
    当你提到二维码时,大多数人想到的是仓库管理或产品标签等"工业"应用,但这篇文章在很大程度上是关于二维码的个人和社会用途。有趣的事实二维(QR)码是在1994年发明的,最近几......
  • python gz解压
    defdecompose_file(data):#ungz_file_path=gz_file_path.replace(".gz","")#withgzip.open(gz_file_path,'rb')asf_in:#withopen(ungz_fil......
  • python 识别二维码内容 及pyzbar OSError: [WinError 126] 报错解决
    importcv2frompyzbar.pyzbarimportdecodeqrcode_image=cv2.imread('bbb.png')aa=decode(qrcode_image)printaa 如果Windows安装pyzbar后遇到OSError:[......
  • 用myBadboy(用python自主开发工具)启动谷歌浏览器并自动录制jmeter脚本
    一、源代码下载https://gitee.com/rmtic/mybadboy 二、操作说明1、在conf目录的config.ini文件中可以配置初始打开网页地址,也可以后面在浏览器中直接修改  2、......
  • python 数据写入yaml 文件中文和排序问题
    前言数据写入yaml文件时遇到的一些问题总结,主要是中文问题和字典的排序问题。环境准备python3.8版本PyYAML版本6.0使用示例将一段python的字典类型,转成yaml文件i......
  • python-pandas提取网页内tables(表格类型)数据
    比如,下面网页里大学排行的数据 分析这个页面,表格内的数据是包裹在tables里的  这样就可以使用pandas对数据进行提取并且导出成csv文件,具体代码很简单 import......
  • 转:图片哈希概论及python中如何实现对比两张相似的图片
    Google以图搜图的原理,其中的获取图片hash值的方法就是AHash。每张图片都可以通过某种算法得到一个hash值,称为图片指纹,两张指纹相近的图片可以认为是相似图片。以图......
  • 【算法】数学中的斐波那契数列
    数学中有一种数列称为 斐波那契数列(Fibonaccisequence),又称为黄金分割数列, 因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数......