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. Duilib扩展《01》— 双击、右键消息扩展

    用过duilib的可能会发现,duilib中有些控件没能很好的区分左键.右键等消息.所以根据实际需要,我们需要进行相关区分处理,或者自行扩展. 一. 左键.右键消息区分 我们以CListUI控件来分析 ...

  2. asp.net中导出Execl的方法

    一.asp.net中导出Execl的方法: 在 asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址 输出在浏览器上:一种是将文件直接将文件输出流写给 ...

  3. leetcode 8

    string类型转换为int类型,需要考虑不同的转换情况. “   04”  转换结果   4: “   4   43”  转换结果  4: “a@12 ”   转换结果    0: “12a”   ...

  4. _func_

    __func__标识符 引用:http://blog.csdn.net/zhoujunyi/article/details/1572325 __func__是C99标准里面预定义标识符, 它是一个st ...

  5. XCode 7.1 安装 Alcatraz包管理器失败的处理

    按照官方的文档(https://github.com/supermarin/Alcatraz),先卸载再重新安装即可.步骤如下: 1. 退出Xcode 2. rm -rf ~/Library/Appl ...

  6. 实现在Android简单封装类似JQuery异步请求

    在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...

  7. 简单linux网络驱动程序

    本文代码参考<LINUX设备驱动程序>第十七章 网络驱动程序 网络地址和虚拟主机地址为: snullnet0 192.168.0.0 snullnet1 192.168.1.0 local ...

  8. Mysql远程登录授权

    1.改表法. 请使用mysql管理工具,如:SQLyog Enterprise 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑使用mysql管理工 ...

  9. Objective-C特点

    1.兼容性 OC是一种面向对象的C语言,在OC的代码中可以有C和C++语句,它可以调用C函数,也可以通过C++对象访问方法. 2.字符串 OC通常不使用C语言风格的字符串.大多数情况下(CoreFou ...

  10. winform之excel导入和导出

    引用命名空间   using Microsoft.Office.Interop.Excel;DataGridView 导出到Excel public static void SaveAs(DataGr ...