CodeApriori.py

"""

Python 3.6

Filename: CodeApriori.py

Author: MaggieForest

Blog: https://www.forestspace.top

Date: 2019/9/29

"""
import csv

def load_data_set():
"""
Load a sample data set (From Data Mining: Concepts and Techniques, 3th Edition)
Returns:
A data set: A list of transactions. Each transaction contains several items.
"""
filename = 'C:\Users\zoushulin\Desktop\Groceries_dataset\Groceries.csv'
with open(filename)as f:
f_csv = csv.reader(f)
for index, val in enumerate(f_csv):
if index != 0:
subList = str(val[1]).replace('}','').replace('{','').split(',')
data_set.append(list(subList))
return data_set

def create_C1(data_set):
"""
Create frequent candidate 1-itemset C1 by scaning data set.
Args:
data_set: A list of transactions. Each transaction contains several items.
Returns:
C1: 包含所有候选一层频繁项集的集合
"""
C1 = set() # 不重复集
for t in data_set:
for item in t:
item_set = frozenset([item]) # item的不可变集合
C1.add(item_set)
print("总项数:" + str(len(C1)))
return C1

def is_apriori(Ck_item, Lksub1):
"""
Judge whether a frequent candidate k-itemset satisfy Apriori property.
Args:
Ck_item: a frequent candidate k-itemset in Ck which contains all frequent
candidate k-itemsets.
Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.
Returns:
True: satisfying Apriori property.
False: Not satisfying Apriori property.
"""
for item in Ck_item:
sub_Ck = Ck_item - frozenset([item])
if sub_Ck not in Lksub1:
return False
return True

def create_Ck(Lksub1, k):
"""
Create Ck, a set which contains all all frequent candidate k-itemsets
by Lk-1's own connection operation.
Args:
Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.
k: the item number of a frequent itemset.
Return:
Ck: a set which contains all all frequent candidate k-itemsets.
"""
Ck = set()
len_Lksub1 = len(Lksub1)
list_Lksub1 = list(Lksub1)
for i in range(len_Lksub1):
for j in range(1, len_Lksub1):
l1 = list(list_Lksub1[i])
l2 = list(list_Lksub1[j])
l1.sort()
l2.sort()
if l1[0:k - 2] == l2[0:k - 2]:
Ck_item = list_Lksub1[i] | list_Lksub1[j]
# pruning
if is_apriori(Ck_item, Lksub1):
Ck.add(Ck_item)
return Ck

def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):
"""
通过ck 执行delete policy 生成频繁项集
Args:
data_set: A list of transactions. Each transaction contains several items.
Ck: 包含所有频繁候选k项集的集合
min_support: The minimum support.
support_data: A dictionary. 键值对,记录频繁项集和其支持度
Returns:
Lk: 包含所有的频繁项集的字典
"""
Lk = []
item_count = {}
for t in data_set: # 遍历所有条目
for item in Ck: # 候选k阶频繁项集循环
if item.issubset(t): # item是否是t的子集 ,并计数存到item_count
if item not in item_count:
item_count[item] = 1
else:
item_count[item] += 1
t_num = float(len(data_set))
for item in item_count:
if (item_count[item] / t_num) >= min_support: # 支持度比较
# print('LK add : ' + str(item))
Lk.append(item)
support_data[item] = item_count[item] / t_num
# print('LK:' + str(Lk))
return Lk # 返回频繁项集

def generate_L(data_set, k, min_support):
"""
生成所有的频繁项集
Args:
data_set: 数据集
k: 频繁项集的最大项数
min_support: 最小支持度
Returns:
L: The list of Lk.
support_data: A dictionary. The key is frequent itemset and the value is support.
"""
support_data = {}
C1 = create_C1(data_set) # 获得一层候选项集
L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data) # 获得一层频繁项集
print("len-lk:" + str(len(list(L1))) + " L1:" + str(L1))
Lksub1 = L1.copy()
L = []
L.append(Lksub1) # List of List
for i in range(2, k + 1): # 多层频繁项集的获取
Ci = create_Ck(Lksub1, i)
Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)
Lksub1 = Li.copy()
L.append(Lksub1)
return L, support_data # L是所有的频繁项集,按照层数保存的List of List,support_data是频繁项集和支持度的键值对

def generate_big_rules(L, support_data, min_conf):
"""
Generate big rules from frequent itemsets.
Args:
L: The list of Lk. 频繁项集 List of List
support_data: A dictionary. The key is frequent itemset and the value is support.
min_conf: Minimal confidence.最小置信度
Returns:
big_rule_list: A list which contains all big rules. Each big rule is represented
as a 3-tuple.
"""
big_rule_list = []
sub_set_list = []
for i in range(0, len(L)): # 遍历频繁项集
for freq_set in L[i]: # 频繁项集
for sub_set in sub_set_list:
if sub_set.issubset(freq_set):
# print("sub_set:" + str(sub_set))
# print("freq_set:" + str(freq_set))
conf = support_data[freq_set] / support_data[freq_set - sub_set] # 支持度计算
big_rule = (freq_set - sub_set, sub_set, conf)
# print("freq_set - sub_set:" + str(freq_set - sub_set))
if conf >= min_conf and big_rule not in big_rule_list:
# print freq_set-sub_set, " => ", sub_set, "conf: ", conf
big_rule_list.append(big_rule)
sub_set_list.append(freq_set)
return big_rule_list

if name == "main":
"""
Test
"""
data_set = load_data_set()
L, support_data = generate_L(data_set, k=3, min_support=0.02) # L是所有的频繁项集,按照阶数保存的List of List,support_data是频繁项集和支持度的键值对,K=3则最高取到三层
big_rules_list = generate_big_rules(L, support_data, min_conf=0.3)
for Lk in L:
print("=" * 50)
# print("***" + str(len(list(Lk))))
print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")
print("=" * 50)
for freq_set in Lk:
print(freq_set, support_data[freq_set])
print()
print("Big Rules")
for item in big_rules_list:
print(item[0], "=>", item[1], "conf: ", item[2])

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 一、问题描述 频繁模式挖掘搜索给定数据集中反复出现的联系,使用Apriori算法挖掘1M电影数据集中用户喜爱的电影...
    solar_4869阅读 1,782评论 0 0
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,443评论 0 13
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,730评论 0 8
  • 关联分析用来寻找事务之间的相关性,这些关系主要有两种形式,频繁项目集或者关联规则。 关联分析涉及的术语和指标: 术...
    洛水青柳2017阅读 1,243评论 0 0
  • “你认识她吗?” “认识啊…”我低头看看自己右手的指尖,干净整洁。 “她知道你吗?” “嗯…”我继续看着另一只手的...
    晨之白月阅读 106评论 0 1