Python实现Apriori

运行环境

  • Pyhton3

计算过程

st=>start: 开始
e=>end: 结束
op1=>operation: 读入数据
op2=>operation: 递归生成频繁项集
op3=>operation: 关联规则挖掘
op4=>operation: 输出结果 st->op1->op2->op3->op4->e

输入样例

/* Apriori.txt */
文本编号 词列表(以空格分隔)
1 消防员 冲进 火场 救出 男童
2 公务员 患 癌症 保持 在岗
3 消防员 多次 冲进 火场 救人 不幸 身亡
4 老人 成功 进行 免费 白内障 手术
5 海豚 误 吞 排球 后 手术 成功 取出
6 6旬 老人 跳楼 自杀 身亡
7 男子 跳楼 自杀 身亡
8 疑犯 枪杀 出租车 司机
9 男子 枪杀 妻子 后 自杀
10 医师 误 把 肾脏 当 肝脏 致人 身亡
11 癌症 老人 成功 手术
12 男子 枪杀 司机 后 喝药 自杀
13 癌症 医师 保持 手术 清醒
14 男子 跳楼 自杀
15 男子 枪杀 老人 后 自杀
16 消防员 冲进 火场 将 男童 救出
17 出租车 司机 免费 搭载 老人
18 男子 误 杀 弟媳 后 自杀 身亡
19 医师 误 把 患者 肝脏 捅破 致人 身亡
20 6旬 老人 火场 救人 不幸 身亡

代码实现

# -*- coding: utf-8 -*-
__author__ = 'Wsine' def loadDataSet(fileName):
attrTemp = []
with open(fileName) as fr:
for line in fr.readlines()[1:]:
words = line.strip().split('\t')[1].split()
attrTemp.extend(words)
attr = list(set(attrTemp))
dataSet = []
with open(fileName) as fr:
for line in fr.readlines()[1:]:
words = line.strip().split('\t')[1].split()
data = []
for word in words:
for index, _word in enumerate(attr):
if word == _word:
data.append(index)
break
dataSet.append(data)
return dataSet, attr def createC1(dataSet):
"""
输入:数据集
输出:所有大小为1的候选项集合C1
"""
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1)) def scanD(D, Ck, minSupport):
"""
输入:数据集集合, 候选项集, 最小支持度
输出:最频繁项集的支持度
"""
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if not can in ssCnt:
ssCnt[can] = 1
else:
ssCnt[can] += 1
numItems = float(len(D))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
if support >= minSupport:
retList.insert(0, key)
supportData[key] = support
return retList, supportData def aprioriGen(Lk, k):
"""
输入:频繁项集列表, 项集元素个数
输出:合并后的项集列表
"""
retList = []
lenLk = len(Lk)
for i in range(lenLk):
for j in range(i+1, lenLk):
L1 = list(Lk[i])[:k-2]
L2 = list(Lk[j])[:k-2]
L1.sort()
L2.sort()
if L1 == L2:
retList.append(Lk[i] | Lk[j])
return retList def apriori(dataSet, minSupport=0.5):
"""
输入:数据集, 最小支持度
输出:候选项集列表
"""
C1 = createC1(dataSet)
D = list(map(set, dataSet))
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData def calcConf(freqSet, H, supportData, br1, minConf=0.7):
"""
输入:频繁项集, 所有项集, 支持度数据, 通过检查的bigRuleList, 最小置信度
输出:满足最小置信度要求的规则列表
"""
prunedH = []
for conseq in H:
conf = supportData[freqSet] / supportData[freqSet - conseq]
if conf >= minConf:
#print(freqSet - conseq, '-->', conseq, 'conf:', conf)
br1.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH def rulesFromConseq(freqSet, H, supportData, br1, minConf=0.7):
"""
输入:频繁项集, 所有项集, 支持度数据, 通过检查的bigRuleList, 最小置信度
描述:生成更多的关联规则
"""
m = len(H[0])
if (len(freqSet) > (m + 1)):
Hmp1 = aprioriGen(H, m + 1)
Hmp1 = calcConf(freqSet, Hmp1, supportData, br1, minConf)
if (len(Hmp1) > 1):
rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf) def generateRules(L, supportData, minConf=0.7):
"""
输入:频繁项集列表, 包含频繁项集支持数据的字典, 最小置信度
输出:置信度规则列表
"""
bigRuleList = []
for i in range(1, len(L)):
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]
if (i > 1):
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
else:
calcConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList def printRules(rules, attr):
for rule in rules:
ruleFrom = []
ruleFromSet = set(rule[0])
while len(ruleFromSet) > 0:
ruleFrom.append(attr[ruleFromSet.pop()])
ruleTo = []
ruleToSet = set(rule[1])
while len(ruleToSet) > 0:
ruleTo.append(attr[ruleToSet.pop()])
print(ruleFrom, '-->', ruleTo)
print('\tconf: ', rule[-1]) def main():
dataSet, attr = loadDataSet('Apriori.txt')
L, supportData = apriori(dataSet, minSupport=0.2)
print('二项集', L[1])
print('三项集', L[2])
rules = generateRules(L, supportData, minConf=0.2)
printRules(rules, attr) if __name__ == '__main__':
main()

输出样例

二项集 [frozenset({32, 39}), frozenset({32, 46}), frozenset({46, 39})]
三项集 [frozenset({32, 46, 39})]
['自杀'] --> ['男子']
conf: 0.8571428571428572
['男子'] --> ['自杀']
conf: 1.0
['后'] --> ['男子']
conf: 0.8
['男子'] --> ['后']
conf: 0.6666666666666667
['自杀'] --> ['后']
conf: 0.5714285714285715
['后'] --> ['自杀']
conf: 0.8
['自杀'] --> ['男子', '后']
conf: 0.5714285714285715
['后'] --> ['男子', '自杀']
conf: 0.8
['男子'] --> ['后', '自杀']
conf: 0.6666666666666667

Python实现Apriori的更多相关文章

  1. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  2. 基于Python的机器学习实战:Apriori

    目录: 1.关联分析 2. Apriori 原理 3. 使用 Apriori 算法来发现频繁集 4.从频繁集中挖掘关联规则 5. 总结 1.关联分析  返回目录 关联分析是一种在大规模数据集中寻找有趣 ...

  3. 数据挖掘入门系列教程(五)之Apriori算法Python实现

    数据挖掘入门系列教程(五)之Apriori算法Python实现 加载数据集 获得训练集 频繁项的生成 生成规则 获得support 获得confidence 获得Lift 进行验证 总结 参考 数据挖 ...

  4. Python 和 R 数据分析/挖掘工具互查

    如果大家已经熟悉python和R的模块/包载入方式,那下面的表查找起来相对方便.python在下表中以模块.的方式引用,部分模块并非原生模块,请使用 pip install * 安装:同理,为了方便索 ...

  5. Python 数据挖掘 工具包整理

    连接器与io 数据库 类别 Python R MySQL mysql-connector-python(官方) RMySQL Oracle cx_Oracle ROracle MongoDB pymo ...

  6. 【机器学习实战】第11章 使用 Apriori 算法进行关联分析

    第 11 章 使用 Apriori 算法进行关联分析 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出 ...

  7. R包和python对应的库

    数据库 类别 Python R MySQL mysql-connector-python(官方) RMySQL Oracle cx_Oracle ROracle Redis redis rredis ...

  8. Apriori算法的原理与python 实现。

    前言:这是一个老故事, 但每次看总是能从中想到点什么.在一家超市里,有一个有趣的现象:尿布和啤酒赫然摆在一起出售.但是这个奇怪的举措却使尿布和啤酒的销量双双增加了.这不是一个笑话,而是发生在美国沃尔玛 ...

  9. Apriori算法Python实现

    Apriori如果数据挖掘算法的头发模式挖掘鼻祖,从60年代开始流行,该算法非常简单朴素的思维.首先挖掘长度1频繁模式,然后k=2 这些频繁模式的长度合并k频繁模式.计算它们的频繁的数目,并确保其充分 ...

随机推荐

  1. JS与JQ倒计时的写法

    页面需要制作一个倒计时的功能:然后度娘了一遍,找到两种写法,原生JS与JQ 的,经过测试原生JS在IE可能会有不刷新的现象所以结合了一个大神的JQ写法修改好了一个. 原生JS写法: HTML: < ...

  2. unity3d发布Android程序

    unity3d是一个跨平台的游戏开发引擎,可以使用c#开发各种平台上的游戏,如windows,Mac,Android,windows phone,IOS,Flash等.下面说下如何将开发好的unity ...

  3. SVN创建资源与分支详解

    创建分支的意义: 简单说,分支就是用于区分开发版本与当前发布版本的. 1. 主干负责新功能的开发 2..分支负责修正当前发布版本的bug(对于可以放入下个发布版本的改进性bug可以直接在主干上开发) ...

  4. DNS服务器:主要介绍DNS的服务原理以及安装及其主从配置

    DNS服务器:主要介绍DNS的服务原理以及安装及其主从配置 一.DNS简介 1.DNS    DNS是域名系统(Domain Name System)的简称,它是一个将域名和IP相互映射的分布式数据库 ...

  5. dwz简单配置与操作

    1.首先将dwz的文件放到你的项目中(http://yunpan.cn/QbTH4kN6UXX9B) 2.在页面中将前台数据复制到页面中,将js,css等路径配置好 3.这个地方一定要配置好,xml文 ...

  6. MongoDB的安装小结

    正在做毕业设计,想尝试着用mongoDB来做数据库,之前没有接触过,然后,就在网上找资料,自己捣鼓,弄了好久才算上真正的把它安上,好心累.... 网上有很多安装教程,大同小异,这里呢,我只是想记录一下 ...

  7. 深入浅出MongoDB(二)概述

    上次的博文深入浅出MongoDB(一)NoSQL中我们已经简单介绍了一下NoSQL的基本概念,这次我们来了解一下MongoDB的相关概念. 1.简介 MongoDB是一款由C++编写的高性能.开源.无 ...

  8. Yii 增删改查 测试记录

    亲们, 我是yii小白 不要笑话我奥.今天白天写一个管理模块涉及到 yii ar 下的  curd 操作,做 update 操作时纠结了好久,今天晚上花点时间学习, 下面写下我的测试记录 代码如下: ...

  9. js数组的内部实现,迭代器,生成器和内包

    js内部实现 在js以外的很多语言中,数组将会隐式占用一段连续的内存空间.这种隐式的内部实现,使得高效的内存使用及高速的元素方法称为可能,而 在javascript中,数组实体是一个对象,所以通常的实 ...

  10. a标签至于flash之上的时候,IE浏览器无法点击连接的问题

    <a style="display: block;height: 131px;position: absolute;z-index: 999;width: 222px;backgrou ...