数据挖掘Apriori算法C++实现

时间:2025-04-20

- --

一、原Apriori算法

1、算法原理:

该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法

(1)L1 = find_frequent_1-itemsets(D); // 挖掘频繁1-项集,比较容易

(2)for (k=2;Lk-1 ≠Φ;k++) {

(3)Ck = apriori_gen(Lk-1 ,min_sup); // 调用apriori_gen方法生成候选频繁k-项集

(4)for each transaction t ∈D { // 扫描事务数据库D

(5)Ct = subset(Ck,t);

(6)for each candidate c ∈Ct

(7)c.count++; // 统计候选频繁k-项集的计数

(8)}

(9)Lk ={c ∈Ck|c.count≥min_sup} // 满足最小支持度的k-项集即为频繁k-项集

(10)}

(11)return L= ∪k Lk; // 合并频繁k-项集(k>0)

2、算法流程

①首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度闵值,得到一项频繁集L1。

②然后通过连接运算,得到二项候选集,对每个候选集再次扫描数据集,得出每个候选集的支持度,再与最小支持度比较。得到二项频繁集L2。

③如此进行下去,直到不能连接产生新的候选集为止。

④对于找到的所有频繁集,用规则提取算法进行关联规则的提取。

3、算法的不足:

(1)数据库重复扫描的次数太多。在由CK寻找LK的过程中,CK中的每一项都需要扫描事务数据库进行验证,以决定其是否加入Lk,存在的频繁K-项集越大,重复扫描的次数就越多。这一过程耗时太大,增加了系统1/0开销,处理效率低[10],不利于实际应用。

(2)产生的候选集可能过于庞大。如果一个频繁1-项集包含100个项,那么频繁2-项集就有C2

100个,为找到元素个数为100的频繁项集,如{b1,b2,…,b100},那么就要扫描数据库100次,产生的候选项集总个数为:

举例:

对于一个这样庞大的项集,计算机难以存储和计算,挖掘效率低下。

二、算法的改进1

1、改进方法:

性质1:频繁项集的所有非空子集都必须是频繁的。(Apriori性质,记为性质1)

性质2:若频繁K-项集Lk中各个项可以做链接产生Lk+1

,则Lk中每个元素在Lk中出现的次数应大于或等于K,若小于K,则删除该项在Lk中所有的事务集[11]。(Apriori性质的推论,记为性质2)

改进的方法:在连接之后得到的候选频繁k项,直接进行最小支持度判断,并进行剪枝,从而直接得到频繁k项集,避免候选项集可能过大的问题;

2、算法的流程

①首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度阈值,得到一项频繁集L1。

- . -word资料-

数据挖掘Apriori算法C++实现.doc 将本文的Word文档下载到电脑

精彩图片

热门精选

大家正在看

× 游客快捷下载通道(下载后可以自由复制和排版)

限时特价:7 元/份 原价:20元

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219