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. meta 标签属性(网站兼容与优化需要)

    概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. —— W3School ...

  2. dubbo使用遇到的问题

    转自:http://blog.csdn.net/liwf_/article/details/40297121?utm_source=tuicool&utm_medium=referral 把一 ...

  3. poj1019_Number_Sequence

    这题目关键是打表,haha[k]数组表示的是S1S2..Sk该串结尾所在的位置.然后用n去找n所在的k值,此时haha[k-1]<n<=haha[k].然后再算出从haha[k]位置到n一 ...

  4. ios英语口语800句应用源码

    前几天突发奇想做了个很水的应用,名字叫chinese 800(汉语口语800句),现在让别人传上去了(正在传). 今天又改了一下变成了英语口语800句.加了广告条 ui 没有优化,我随便整的两个图片, ...

  5. Oracle VM VirtualBox 设置本机与虚拟机共享文件

    文章转载自http://wenku.baidu.com/link?url=5uZ1xWnGC55FGW2XUqzLVdttRcik2xCqwRKEdh6z-nZJ63UQn3j2750ES_q4Oro ...

  6. 软件工程 speedsnail 冲刺9

    20150313 完成任务:为周五检查做了相关准备,包括稳定性测试,分辨率测试: 遇到问题: 问题1 进入关卡的开始蜗牛会跳一段距离 解决1 没有解决 明日任务: 冲刺结束

  7. C# 判断一字符串是否为合法数字(正则表达式)

    判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; ...

  8. datagridview添加复选框全选和取消

    全选 private void All_selected_Click(object sender, EventArgs e) { ; i < this.DataGridViewProduct.R ...

  9. Ajax的利弊

    ajax的优点  1.最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好. 2.使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力. 3.可以把以前一些服务器负担的工 ...

  10. 前端构建工具grunt

    简单配置grunt 配置gulp还是grunt都是在node的环境下安装的,所以在这之前保证你的node环境已经安装好了! -------------------------------------- ...