apriori函数有没有办法不c语言输出函数过程哇

随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的Apriori算法可以告诉我们。本文首先对Apriori算法进行简介,而后进一步介绍相关的基本概念,之后详细的介绍Apriori算法的具体策略和步骤,最后给出Python实现代码。
Github代码地址:
1.Apriori算法简介
Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时,通常会使用先验知识或者假设,这被称作"一个先验"(a priori)。Apriori算法的名字正是基于这样的事实:算法使用频繁项集性质的先验性质,即频繁项集的所有非空子集也一定是频繁的。Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记为L1。然后,使用L1找出频繁2项集的集合L2,使用L2找出L3,如此下去,直到不能再找到频繁k项集。每找出一个Lk需要一次数据库的完整扫描。Apriori算法使用频繁项集的先验性质来压缩搜索空间。
2. 基本概念
项与项集:设itemset={item1, item_2, &, item_m}是所有项的集合,其中,item_k(k=1,2,&,m)成为项。项的集合称为项集(itemset),包含k个项的项集称为k项集(k-itemset)。
事务与事务集:一个事务T是一个项集,它是itemset的一个子集,每个事务均与一个唯一标识符Tid相联系。不同的事务一起组成了事务集D,它构成了关联规则发现的事务数据库。
关联规则:关联规则是形如A=&B的蕴涵式,其中A、B均为itemset的子集且均不为空集,而A交B为空。
支持度(support):关联规则的支持度定义如下:
其中表示事务包含集合A和B的并(即包含A和B中的每个项)的概率。注意与P(A or B)区别,后者表示事务包含A或B的概率。
置信度(confidence):关联规则的置信度定义如下:
项集的出现频度(support count):包含项集的事务数,简称为项集的频度、支持度计数或计数。
频繁项集(frequent itemset):如果项集I的相对支持度满足事先定义好的最小支持度阈值(即I的出现频度大于相应的最小出现频度(支持度计数)阈值),则I是频繁项集。
强关联规则:满足最小支持度和最小置信度的关联规则,即待挖掘的关联规则。
3. 实现步骤
一般而言,关联规则的挖掘是一个两步的过程:
找出所有的频繁项集
由频繁项集产生强关联规则
3.1挖掘频繁项集
3.1.1 相关定义
连接步骤:频繁(k-1)项集Lk-1的自身连接产生候选k项集Ck
&&&&Apriori算法假定项集中的项按照字典序排序。如果Lk-1中某两个的元素(项集)itemset1和itemset2的前(k-2)个项是相同的,则称itemset1和itemset2是可连接的。所以itemset1与itemset2连接产生的结果项集是{itemset1[1], itemset1[2], &, itemset1[k-1], itemset2[k-1]}。连接步骤包含在下文代码中的create_Ck函数中。
由于存在先验性质:任何非频繁的(k-1)项集都不是频繁k项集的子集。因此,如果一个候选k项集Ck的(k-1)项子集不在Lk-1中,则该候选也不可能是频繁的,从而可以从Ck中删除,获得压缩后的Ck。下文代码中的is_apriori函数用于判断是否满足先验性质,create_Ck函数中包含剪枝步骤,即若不满足先验性质,剪枝。
基于压缩后的Ck,扫描所有事务,对Ck中的每个项进行计数,然后删除不满足最小支持度的项,从而获得频繁k项集。删除策略包含在下文代码中的generate_Lk_by_Ck函数中。
3.1.2 步骤
每个项都是候选1项集的集合C1的成员。算法扫描所有的事务,获得每个项,生成C1(见下文代码中的create_C1函数)。然后对每个项进行计数。然后根据最小支持度从C1中删除不满足的项,从而获得频繁1项集L1。
对L1的自身连接生成的集合执行剪枝策略产生候选2项集的集合C2,然后,扫描所有事务,对C2中每个项进行计数。同样的,根据最小支持度从C2中删除不满足的项,从而获得频繁2项集L2。
对L2的自身连接生成的集合执行剪枝策略产生候选3项集的集合C3,然后,扫描所有事务,对C3每个项进行计数。同样的,根据最小支持度从C3中删除不满足的项,从而获得频繁3项集L3。
以此类推,对Lk-1的自身连接生成的集合执行剪枝策略产生候选k项集Ck,然后,扫描所有事务,对Ck中的每个项进行计数。然后根据最小支持度从Ck中删除不满足的项,从而获得频繁k项集。
3.2 由频繁项集产生关联规则
一旦找出了频繁项集,就可以直接由它们产生强关联规则。产生步骤如下:
对于每个频繁项集itemset,产生itemset的所有非空子集(这些非空子集一定是频繁项集);
对于itemset的每个非空子集s,如果,则输出,其中min_conf是最小置信度阈值。
4. 样例以及Python实现代码
下图是《数据挖掘:概念与技术》(第三版)中挖掘频繁项集的样例图解。
本文基于该样例的数据编写Python代码实现Apriori算法。代码需要注意如下两点:
由于Apriori算法假定项集中的项是按字典序排序的,而集合本身是无序的,所以我们在必要时需要进行set和list的转换;
由于要使用字典(support_data)记录项集的支持度,需要用项集作为key,而可变集合无法作为字典的key,因此在合适时机应将项集转为固定集合frozenset。
# Python 2.7
# Filename: apriori.py
# Author: llhthinker
# Email: hangliu56[AT]gmail[DOT]com
# Blog: http://www.cnblogs.com/llhthinker/p/6719779.html
def load_data_set():
Load a sample data set (From Data Mining: Concepts and Techniques, 3th Edition)
A data set: A list of transactions. Each transaction contains several items.
data_set = [['l1', 'l2', 'l5'], ['l2', 'l4'], ['l2', 'l3'],
['l1', 'l2', 'l4'], ['l1', 'l3'], ['l2', 'l3'],
['l1', 'l3'], ['l1', 'l2', 'l3', 'l5'], ['l1', 'l2', 'l3']]
return data_set
def create_C1(data_set):
Create frequent candidate 1-itemset C1 by scaning data set.
data_set: A list of transactions. Each transaction contains several items.
C1: A set which contains all frequent candidate 1-itemsets
C1 = set()
for t in data_set:
for item in t:
item_set = frozenset([item])
C1.add(item_set)
def is_apriori(Ck_item, Lksub1):
Judge whether a frequent candidate k-itemset satisfy Apriori property.
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.
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.
Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.
k: the item number of a frequent itemset.
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])
if l1[0:k-2] == l2[0:k-2]:
Ck_item = list_Lksub1[i] | list_Lksub1[j]
if is_apriori(Ck_item, Lksub1):
Ck.add(Ck_item)
def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):
Generate Lk by executing a delete policy from Ck.
data_set: A list of transactions. Each transaction contains several items.
Ck: A set which contains all all frequent candidate k-itemsets.
min_support: The minimum support.
support_data: A dictionary. The key is frequent itemset and the value is support.
Lk: A set which contains all all frequent k-itemsets.
Lk = set()
item_count = {}
for t in data_set:
for item in Ck:
if item.issubset(t):
if item not in item_count:
item_count[item] = 1
item_count[item] += 1
t_num = float(len(data_set))
for item in item_count:
if (item_count[item] / t_num) &= min_support:
Lk.add(item)
support_data[item] = item_count[item] / t_num
def generate_L(data_set, k, min_support):
Generate all frequent itemsets.
data_set: A list of transactions. Each transaction contains several items.
k: Maximum number of items for all frequent itemsets.
min_support: The minimum support.
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)
Lksub1 = L1.copy()
L.append(Lksub1)
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
def generate_big_rules(L, support_data, min_conf):
Generate big rules from frequent itemsets.
L: The list of Lk.
support_data: A dictionary. The key is frequent itemset and the value is support.
min_conf: Minimal confidence.
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):
conf = support_data[freq_set] / support_data[freq_set - sub_set]
big_rule = (freq_set - sub_set, sub_set, conf)
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__":
data_set = load_data_set()
L, support_data = generate_L(data_set, k=3, min_support=0.2)
big_rules_list = generate_big_rules(L, support_data, min_conf=0.7)
for Lk in L:
print "="*50
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 "Big Rules"
for item in big_rules_list:
print item[0], "=&", item[1], "conf: ", item[2]
代码运行结果截图如下:
==============================
《数据挖掘:概念与技术》(第三版)
《机器学习实战》
阅读(...) 评论()关于apriori算法在R语言中的代码
<a data-traceid="question_detail_above_text_l&&
想请教一下apriori算法在R语言中的这段代码要怎么进行注释?就是大概每一句或者某一句大概是什么意思或者什么功能?在下刚学数据挖掘,R语言功底也不深,已被整疯T^T
function (data, parameter = NULL, appearance = NULL, control = NULL)&
& & data &- as(data, "transactions")
& & items &- data
& & if (is(appearance, "list"))&
& & & & appearance &- as(c(appearance, list(labels = itemLabels(data))),&
& & & & & & "APappearance")
& & appearance &- as(appearance, "APappearance")
& & control &- as(control, "APcontrol")
& & parameter &- as(parameter, "APparameter")
& & if (control@verbose) {
& & & & cat("\nParameter specification:\n")
& & & & print(parameter)
& & & & cat("\nAlgorithmic control:\n")
& & & & print(control)
& & & & cat("\n")
& & abs_supp &- as.integer(parameter
* length(data))
& & if (abs_supp & 2)&
& & & & warning(sprintf("You chose a very low absolute support count of %d. You might run out of memory! Increase minimum support.\n",&
& & & & & & abs_supp), immediate. = TRUE)
& & result &- .Call("rapriori", items@p, items
, items@Dim,&
& & & & parameter, control, appearance, data@itemInfo, PACKAGE = "arules")
& & call &- match.call()
& & result@info &- list(data = call$data, ntransactions = length(data),&
& & & & support = parameter@support, confidence = parameter@confidence)
& & if (is(result, "rules")) {
& & & & validObject(result@lhs@data)
& & & & validObject(result@rhs@data)
& & else {
& & & & validObject(result@items@data)
& & result
&environment: namespace:arules&
啥玩意儿,完全没见过。arules的官方例子是下面这样的:
data("Adult")
## Mine association rules.
rules &- apriori(Adult,
parameter = list(supp = 0.5, conf = 0.9,
target = "rules"))
summary(rules)
--- 共有 7 条评论 ---
: 请问你的问题解决了吗?
: 不啊 大三...我们开的【数据挖掘与分析】,然后对应的实验课用的【R语言实战】,人民邮电的那版图灵教育的
国内还有这样的大学和老师?还有人研究R?
: 我也是懵了......可是没办法啊,老师让注释这段源代码,才刚学数据挖掘......还是谢谢了
啊,被顶到头条了啊!
--- 共有 1 条评论 ---
估计是因为相似关键字最多了吧...
数据挖掘入门到精通—R语言视频教程
课程观看地址:
一、课程所用软件:R 3.2.2(64位) &RStudio
二、课程涉及到的技术点:
1)R语言的基本语法、函数
2)R中实用性很强的包
3)模式识别、分类预测算法原理及其实现
三、课程学习目标:
本课程讲解理论的同时结合大量的案例,让学习者可以快速掌握数据挖掘技能,并利用R数据处理、画图、
实现据挖掘模型的建立。学习完本课程,学习者能达到以下目标:
1)掌握基本R用法;
2)用R进行描述性统计分析、进行数据处理和数据可视化;
3)缺失值的清洗能力;
4)用R语言建立数据挖掘模型;
四、课程大纲:
第一章:基本概念介绍
第1课、数据挖掘、R语言概念介绍
第2课、软件安装和数据的读、写、修改&
第3课、基本概念讲解(向量、矩阵、因子、数据框、列表)&
第4课、基本图形的讲解和绘制&
第二章:实用软件包介绍及应用
第5课、plyr包主函数讲解
第6课、plyr包辅助函数讲解
第7课、Ggpolt2介绍&
第8课、Ggpolt2实践
第9课、reshape2包的讲解和实际操作&
第10课、课缺失值的处理&
第三章:算法讲解及应用
第11课、knn原理简介&
第12课、knn算法实际操作&
第13课、决策树的理论讲解&
第14课、决策树实操&
第15课、人工神经网络的介绍1&
第16课、人工神经网络介绍2&
第17课、人工神经网络实操1&
第18课、人工神经网络实操2&
第19课、支持向量机原理介绍
第20课、支持向量机的实操&Apriori初步学习+C++实现
1.基本概念
Apriori算法是一种挖掘关联规则的频繁项集算法,最早由R.Agrawal提出,现已广泛的运用到商业、等领域。最常见的淘宝相关推荐便包含有这一算法。
该算法的主要步骤为:
(1) 找到所有支持度大于最小支持度的项目集,即频繁项集(Frequent Itemset);
(2) 使用第(1)步的频繁项目集产生期望的规则。
Apriori算法着重与第一步,挖掘频繁项集。
形式化描述如下:令项集I={i1,i2,...in}且有一个数据集合D,它其中的每一条记录T,都是I的子集。
那么关联规则都是形如A-&B的表达式,A、B均为I的子集,且A与B的交集为空。
这条关联规则的支持度:support = P(A&B)
这条关联规则的置信度:confidence = support(A&B)/suport(A)
如果存在一条关联规则,它的支持度和置信度都大于预先定义好的最小支持度与置信度,我们就称它为强关联规则。强关联规则就可以用来了解项之间的隐藏关系。所以关联分析的主要目的就是为了寻找强关联规则,而Apriori算法则主要用来帮助寻找强关联规则。
2.算法描述
符号说明:
k-itemset k维项目集
L(k) 具有最小支持度的最大 k-itemset
C(k) 候选的k维项目集
首先用sc.candidate通过第(k-1)步中生成的最大项目集L(k-1)来生成候选项目集
然后搜索计算候选项目集的C(k)的支持度 By count_support 函数
--------------------------------------------------------------------
C(1) = { candidate 1-itemsets };
L(1) = {c & C(1)
c.count &= minsupport};
for(k=2; L(k-1) != NULL; k++) //直到不能再生成最大项目集为止
C(k) = sc.candidate( L(k-1) );//生成含k个元素的候选项目集C(k)
for all transactions t & D//事务 D为数据库
C(t) = count_support(C(k),t);//包含在事务t中的候选项目集
计算支持度
for all candidates c & C(t)
c.count = c.count + 1;
L(k) = {c & C(k) c.count &= minsupport};
resultset = resultset
L(k) //resultset 最大项目集
sc.candidate 函数
该函数的参数为 L(k-1) 即:所有最大 k-1 维项目集,结果返回含有 K 个项目的候选项目集 C(k)
事实上,C(k)是 k 维最大项目集的超集,通过函数 count_support 计算项目的支持度,然后生成 L(k)
该函数的实现步骤如下:
首先,通过对 L(k-1) 自连接操作生成 C(k) ,称 join (连接)步。
insert into C(K)
select P.item1,P.item2,......P.itemk-1,Q.itemk-1
from L(k-1)P,L(k-1)Q
where P.item1 = Q.item1,......P.itemk-2 = Q.itemk-2,P.itemk-1 & Q.itemk-1
然后是 prune(修剪)步,即对任意的 c , c & C(k) ,删除 C(k) 中所有那些(k-1)维子集不在 L(k-1) 中的项目集
得到候选项目集 C(k) ,表述为:
for all itemset c & C(k)
for all (k-1)维子集 s of c
if(s !& L(k-1)) then
delete c from C(k)
用集合表示 C(k) == { X & C(k) , X 的所有k-1维子集在 L(k-1) 中}
count_support 函数
参数为候选项目集 C(k) 和某一事务记录 t , 结果返回这一事务 t 中包含的候选项目集
它的主要功能是找到包含在事务 t 中所有的候选项目集。
在学习代码中,也学习了STL容器的一些相关使用方法,并记录笔记。想要直接看程序代码的请拖到最后即可。
//vector从后面快速的插入与删除,直接访问任何元素
//map 一对多映射,基于关键字快速查找,不允许重复值
For example, the following code creates a map that associates a string with an integer
ages[&Homer&] = 38;
ages[&Marge&] = 37;
ages[&Lisa&] = 8;
ages[&Maggie&] = 1;
ages[&Bart&] = 11;
insert的使用
pair insert( const pair &val );
//只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。
迭代器 iterator 的使用
迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。
事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。
如下代码对vector容器对象生成和使用了迭代器:
vector the_
vector::iterator the_
for( int i=0; i & 10; i++ )
the_vector.push_back(i);//push_back() 在Vector最后添加一个元素
int total = 0;
the_iterator = the_vector.begin();
while( the_iterator != the_vector.end() ) {
total += *the_ //point是地址 *p 是取地址p里面的值
the_iterator++;
cout && &Total=& && total &&//提示:通过对一个迭代器的解引用操作(*),可以访问到容器所包含的元素。&
cout && &Bart is & && ages[&Bart&] && & years old& &&
map容器的迭代器里面 有first 和 second
m[&one&] = 1;
map::iterator p = m.begin();
p-& // 这个是
值是 &one&
p-& //这个是 int 值是 1
pair类型 (https://blog.csdn.net/xywlpo/article/details/6458867)
pair是一种模版类型,其中包含两个数值,两个数据的类型可以不同,基本的定义如下:
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,
如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
pair a(&James&, &Joy&);
也可以像上面一样在定义的时候直接对其初始化。
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair
author pro(&May&, &Lily&);
author joye(&James&, &Joyce&);
pair对象的操作:
对于pair类,它只有两个元素,分别为first 和 second
pair a(&Lily&, &Poly&);
name = pair.
生成新的pair对象
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
int a = 8;
string m = &James&;
newone = make_pair(a, m);
完整代码如下:
class Apriori
//构造函数
Apriori(size_t is =0,unsigned int mv=0)
item_size =
min_value =
//~Apriori() {};
void getItem();
map& vector,unsigned int& find_freitem();//求事务的频繁项
//连接两个k-1级频繁项,得到第k级频繁项
map& vector,unsigned int & apri_gen(unsigned int K , map& vector,unsigned int & K_item);
//展示频繁项集
void showAprioriItem(unsigned int K,map& vector,unsigned int & showmap);
map& int , vector &//存储所有最开始的事务及其项
map& vector,unsigned int & K_//存储频繁项集
size_t item_//事务数目
int min_//最小阈值
void Apriori::getItem()//用户输入最初的事务集
int ci = item_
for (int i=0;i
cout&&&请输入第 &&<i+1<&str && str !=&123&)
temp.push_back(str);
sort(temp.begin(),temp.end());
pair& map &::iterator , bool& ret = item.insert(make_pair(i+1 ,temp));
if (!ret.second)
cout&&&你输入的元素已存在!请重新输入!&& &::
for (mit=item.begin();mit != item.end();mit++)
vector vec = mit-&
if (vec.size() != 0) //vec不为空则跳出
if (mit == item.end())//事务集为空
cout&&&事务集为空!程序无法进行...&&,unsigned int&
map& vector,unsigned int & K_itemTemp = K_//k_item 储存频繁项集
K_item = apri_gen(i++,K_item);//循环生成k_item
if (K_itemTemp == K_item)
i = UINT_MAX;
//判断是否需要进行下一次的寻找
map& vector,unsigned int & pre_K_item = K_
size_t Kitemsize = K_item.size();
//存储应该删除的第K级频繁项集,不能和其他K级频繁项集构成第K+1级项集的集合
if (Kitemsize != 1 && i != 1)
vector& map& vector,unsigned int &::iterator & eraseVecM
map& vector,unsigned int &::iterator pre_K_item_it1 = pre_K_item.begin() , pre_K_item_it2;
while (pre_K_item_it1 != pre_K_item.end() )
map& vector,unsigned int &::iterator mit = pre_K_item_it1;
bool isExist =
vector vec1;
vec1 = pre_K_item_it1-&
vector vec11(vec1.begin(),vec1.end()-1);
while (mit != pre_K_item.end())
vector vec2;
vec2 = mit-&
vector vec22(vec2.begin(),vec2.end()-1);
if (vec11 == vec22)
if (mit == pre_K_item.end())
if (!isExist && pre_K_item_it1 != pre_K_item.end())
eraseVecMit.push_back(pre_K_item_it1);//该第K级频繁项应该删除
++pre_K_item_it1;
size_t eraseSetSize = eraseVecMit.size();
if (eraseSetSize == Kitemsize)
vector& map& vector,unsigned int &::iterator &::iterator currentErs = eraseVecMit.begin();
while (currentErs != eraseVecMit.end())//删除所有应该删除的第K级频繁项
map& vector,unsigned int &::iterator eraseMit = *currentE
K_item.erase(eraseMit);
++currentE
if(Kitemsize == 1 )
cout&,unsigned int & Apriori::apri_gen(unsigned int K , map& vector,unsigned int & K_item)
if (1 == K)//求候选集C1
size_t c1 = item_
map& int , vector &::iterator mapit = item.begin();
while (mapit != item.end() )//将原事务中所有的单项统计出来
vector temp = mapit-&
vector::iterator vecit = temp.begin();
while (vecit != temp.end() )
pair& map::iterator , bool & ret = c1_itemtemp.insert(make_pair(*vecit++ , 1));
if (!ret.second)
++ ret.first-&
map::iterator item_it = c1_itemtemp.begin();
map& vector,unsigned int & c1_
while (item_it != c1_itemtemp.end() )//构造第一级频繁项集
if ( item_it-&second &= min_value)
temp.push_back(item_it-&first);
c1_item.insert(make_pair(temp , item_it-&second) );
return c1_
cout&,unsigned int &::iterator ck_item_it1 = K_item.begin(),ck_item_it2;
map& vector,unsigned int & ck_
while (ck_item_it1 != K_item.end() )
ck_item_it2 = ck_item_it1;
++ck_item_it2;
map& vector,unsigned int &::iterator mit = ck_item_it2;
//取当前第K级频繁项与其后面的第K级频繁项集联合,但要注意联合条件
//联合条件:连个频繁项的前K-1项完全相同,只是第K项不同,然后两个联合生成第K+1级候选频繁项
while(mit != K_item.end() )
vector vec,vec1,vec2;
vec1 = ck_item_it1-&
vec2 = mit-&
vector::iterator vit1,vit2;
vit1 = vec1.begin();
vit2 = vec2.begin();
while (vit1 & vec1.end() && vit2 & vec2.end() )
string str1 = *vit1;
string str2 = *vit2;
if ( K ==2 || str1 == str2 )
if (vit1 != vec1.end() && vit2 != vec2.end() )
vec.push_back(str1);
if (vit1 == vec1.end() && vit2 == vec2.end() )
string str1 = *vit1;
string str2 = *vit2;
if (str1&str2)
vec.push_back(str2);
vec.push_back(str1);
vec.push_back(str1);
vec.push_back(str2);
map& int , vector &::iterator base_item = item.begin();
unsigned int Acount = 0 ;
while (base_item != item.end() )//统计该K+1级候选项在原事务集出现次数
unsigned int count = 0 ,mincount = UINT_MAX;
vector vv = base_item-&
vector::iterator vecit ,
for (vecit = vec.begin();vecit & vec.end();vecit++)
string t = *
count = 0;
for (bvit=vv.begin();bvit & vv.end();bvit++)
if (t == *bvit)
mincount = (count & mincount ? count : mincount );
if (mincount &=1 && mincount != UINT_MAX)
if (Acount &= min_value && Acount != 0)
sort(vec.begin(),vec.end());
//该第K+1级候选项为频繁项,插入频繁项集
pair& map& vector,unsigned int &::iterator , bool& ret = ck_item.insert(make_pair(vec,Acount));
if (! ret.second)
ret.first-&second += A
++ck_item_it1;
if (ck_item.empty())//该第K+1级频繁项集为空,说明调用结束,把上一级频繁项集返回
return ck_
void Apriori::showAprioriItem(unsigned int K,map& vector,unsigned int & showmap)
map& vector,unsigned int &::iterator showit = showmap.begin();
if (K != UINT_MAX)
cout&<endl<::iterator vecit = vec.begin();
cout&&&{ &;
while (vecit != vec.end())
cout&&*vecit&&&
cout&&&}&&&&\t&;
cout&second&= &#39;0&#39; && str[i] &= &#39;9&#39;)
num += str[i] - &#39;0&#39;;
void main()
unsigned int itemsize = 0;
//输入 事务数(itemsize) 和 最小阀值(minsupport)
cout&&&请输入事务数:&;
char * str =
itemsize = parseNumber(str);
if (itemsize == 0)
cout&&&请输入大于0正整数!&&,unsigned int& AprioriMap = a.find_freitem();
//a.showAprioriItem(UINT_MAX,AprioriMap);
system(&pause&);
}</endl<</i+1<}

我要回帖

更多关于 php 输出函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信