1、apriori算法实现步骤:
apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法apriori使用一种称作逐层搜索的迭代方法,“k-1项集”用于搜索“k项集”。
首先,找出频繁“1项集”的集合,该集合记作l1。l1用于找频繁“2项集”的集合l2,而l2用于找l3。如此下去,直到不能找到“k项集”。找每个lk都需要一次数据库扫描。
核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某
个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从ck中删除。
简单的讲,1、发现频繁项集,过程为(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集 重复步骤(1)~(5)直到不能发现更大的频集
2、产生关联规则,过程为:根据前面提到的置信度的定义,关联规则的产生如下:
(1)对于每个频繁项集l,产生l的所有非空子集;
(2)对于l的每个非空子集s,如果
p(l)/p(s)≧min_conf
则输出规则“sàl-s”
注:l-s表示在项集l中除去s子集的项集
例子:
代码实现:
在讲究代码之前,我先跟大家讲清楚我代码里面说需要的关键点。我的算法全部加起来最多一百多行代码,同时我包装在三个函数中:compute_sup.m(算支持度)、compute_conf.m(算可信度)、apriori.m(主函数)。
-----------------------compute_sup.m-------------------------------------------------------------------------
function sup=compute_sup(s, d)
%------------s指传入的一个行向量--------
%------------d指整个数据集------------
sup=0;
[m,n]=size(d);
for i=1:1:m
%对应取出d的第i行与s对比,若d(i)-s所有的都>=0则支持度+1
if all((d(i,:)-s)>=0)
sup=sup+1;
end
end
-----------------------------测试------------------------------
已知(自己构造)
d =
1 1 0 0 1
0 1 0 1 0
0 1 1 0 0
1 1 0 1 0
1 0 1 0 0
0 1 1 0 0
1 0 1 0 0
1 1 1 0 1
1 1 1 0 0
输入:sup=compute_sup([1,1,0,0,0], d)
输出:sup = 4
--------------------------------------compute_conf.m-----------------------------------------------
function conf=compute_conf(q,d)
%q指传入的一条关联规则,如:[-1,0,0,1,0]指a->d=p(ad)/p(a)
s=abs(q);
d=(abs(q)-q)/2;
conf=compute_sup(s,d)/compute_sup(d,d); %p(ad)/p(a)
------------------------------------------测试-----------------------------------------------------------------------------------
已知d
输入:conf=compute_conf([-1,0,0,1,0],d)
输出:conf = 0.1667 %置信度为0.1667
----------------------------------------------apriori.m(算法的核心)---------------------------------
function [r,sup,conf]=apriori(d,min_sup,min_conf)
%--------------r指生成的强关联规则----------------------
%--------------输出sup指支持度、min_sup-最小支持度-------------------------
%--------------
[n,m]=size(d);
min_sup=min_sup*n;
l=[];
%产生频繁集
c1=eye(m);
ck=c1;
for k=1:m
lk=[];
q=size(ck,1);
for i=1:q
%-----------------剪枝-------------------------
sup= compute_sup(ck(i,:),d);
if sup>=(min_sup)
lk=[lk;ck(i,:)];
end
end
ck=[];
q=size(lk,1);
for i=1:q
for j=i+1:q
indi=find(lk(i,:)==1);
indj=find(lk(j,:)==1);
ind=indi-indj;
%从候选集中选出频繁集,相邻两个行对比,前k-1个相同,第k个不同,然后加入ck。
if(all(ind(1:k-1)==0)&& ind(k)~=0)
ck=[ck;lk(i,:)|lk(j,:)];
end
end
end
l=[l;lk];
end
%-------产生强关联规则-----------------
q=size(l,1);
r=[];
h=[];
m=[];
for i=1:q
ind =find(l(i,:)==1);
if length(ind)==1 continue;end
for j=1:length(ind)-1
subset= nchoosek(ind,j);
n=size(subset,1);
for m=1:n
l(i,subset(m,:))=-1;
h=[h;l(i,:)];
l=abs(l);
end
end
end
%---------------生成规则---------------
m=size(h,1);
m=abs(h);
t=[];
for n=1:m
sup=compute_sup(m(n,:),d);
conf=compute_conf(h(n,:),d);
if conf>=min_conf
t=[t;h(n,:),sup,conf];
end
end
r=[r;t];
end
---------------------------------------------------结果测试---------------------------------------------------------------------
已知
d =
1 1 0 0 1
0 1 0 1 0
0 1 1 0 0
1 1 0 1 0
1 0 1 0 0
0 1 1 0 0
1 0 1 0 0
1 1 1 0 1
1 1 1 0 0
min_conf = 0.6000
min_sup=0.2000
输入:[r,sup,conf]=apriori(d,min_sup,min_conf)
输出:
r =
-1.0000 1.0000 0 0 0 4.0000 0.6667 %a->b
-1.0000 0 1.0000 0 0 4.0000 0.6667
1.0000 0 -1.0000 0 0 4.0000 0.6667
1.0000 0 0 0 -1.0000 2.0000 1.0000
0 1.0000 -1.0000 0 0 4.0000 0.6667
0 1.0000 0 -1.0000 0 2.0000 1.0000
0 1.0000 0 0 -1.0000 2.0000 1.0000
1.0000 1.0000 0 0 -1.0000 2.0000 1.0000
-1.0000 1.0000 0 0 -1.0000 2.0000 1.0000
1.0000 -1.0000 0 0 -1.0000 2.0000 1.0000
由于最小可信度是double型,所以弄得整个矩阵都是double行,有点失策。。。
谷歌人工智能研究人员创建了一种人工智能模型ALBERT
诺基亚智能电视搭载JBL音箱系统,还将有望装备杜比音效
使用光驱制作简单的3D打印机
苹果应收购诺基亚?囊括专利宝库 改进地图
工业4.0发展和半导体制造网络整合
Matlab关于Apriori算法设计
奔驰EQE的智能驾驶辅助系统功能解析
PK高通,汇顶科技有望拿下三星屏幕指纹订单
openEuler社区邀您共同探索Embedded技术
国内智能穿戴市场分析
获5G CE认证证书,OPPO携手消费者迈向5G时代!
pcb设计的关键点有哪一些
长沙清退40万辆共享电单车
首艘国产航母下水背后的功过是非
自动化生产线,工业机器人发挥重要的价值作用
锻造工艺需要去氧化皮设备吗
2019亚太地区AI系统支出预计将达到55亿美元 相比2018年增加了近80%
管网流量计推荐方案
SiliconLabs在2019年取得了傲人的成绩
20个解决日常问题的Python代码片段!