用C#实现Apriori算法(文档)

来源:互联网 发布:矩阵lu分解步骤 编辑:程序博客网 时间:2024/06/08 07:18

背景Apriori是最著名的关联规则算法,广泛应用于购物篮分析等商业领域,本实现使用软微的示例数据库AdventureWorks,实现的功能与sql server2005数据挖掘教程市场篮方案一样

<!--[if !supportLists]-->1. <!--[endif]-->输入:读取数据库,从数据库AdventureWorksDW中读取视图vAssocSeqLineItemsOrderNumberModel,每一个OrderNumber和它关联的Model作为一个事务

<!--[if !supportLists]-->2. <!--[endif]-->数据存储结构:所有事务(项集)用一个ArrayList保存,每个事务(项集)用string保存,并且不同的项用” , ”分开,我在此处同时为了迭代L方便,建立ItemSet对象(包括项集Items,支持度Sup 但估计会增加算法的运行时间

<!--[if !supportLists]-->3. <!--[endif]-->输出: 所有的频繁项集L

<!--[if !supportLists]-->4. <!--[endif]-->时间复杂度:4次方阶,实际运行时间也是很恐怖的60秒左右,apriori算法的缺点就是效率低,而且我写的程序效率也低,忙完这段会继续对算法学习和改进

算法:(我基于自己的理解和实现上的方便作了点修改,原伪代码可见《数据挖掘教程》Margaret H.Dunhama)

输入:

I //项目集合,初始值为候选1项集

D //事务数据库

S //支持度

输出:

L //大项目集

Apriori算法:

repeat

Icount //项集计数器

Ifrequent //候选项集产生的频繁项集

For each I(i)I do

Icount(i)=0; //每一个项目集的初始计数设为0

For each D(i)D do

For each I(j)I do

If I(j)D(i) then

Icount(j)=Icount(j)+1;

For each I(i)I do

If Icount(i)(s×|D|) then

Ifrequent=IfrequentI(i)

L=LIfrequent

I=Apriori-Gen(Ifrequent)

until I为空

 

Apriori-Gen()

输入:

L(i-1) //大小为i-1的频繁项集

输出:

C(i) //大小为i的候选集

Apriori-Gen算法:

C(i) //初始化为空

For each lL(i-1) do

For each JIL(i-1) do

if i-1个项相同 then

C(i)=C(i){IJ};

薄弱环节和附加任务: C#数组,算法时间复杂度,VS环境下单元测试的编写

原创粉丝点击