用来实现关联分析的Apriori算法matlab实现
该函数用来处理二元表示问题,经过改动可以用来处理序列模式,这也是我之后要做的一个内容。
该函数由主函数,生成候选项集,剪枝以及二元化四个部分组成。数据使用的是mushroom.
function Ck = candidate_gen(Fk)
% 用于产生候选项集,产生k+1候选项集,Fk为列矩阵,原项集一般情况下为k列
Ck=[];
M=size(Fk,1);%剩余序列个数
k=size(Fk,2);%k序列
w=1;%计数用
for i=1:M-1 %1和2比,1和3比。。。1和N比
for j=i+1:M
if k==1
Ck(w,:)=[Fk(i,1:k) Fk(j,k)];%第w行序列
w=w+1;
elseif Fk(i,1:k-1)==Fk(j,1:k-1)
Ck(w,:)=[Fk(i,1:k) Fk(j,k)];%第w行序列
w=w+1;
else break;
end
end
end
flag=0;
%剪枝步骤:
w=size(Ck,1); %记录w行
for i=1:w
for j=1:M
if (ismember(Fk(j,:),Ck(i,:)))
flag=1;break;
end
end
if flag==0
Ck(i,:)=[];
end
flag=0;
end
end
```csharp
function [ B ] = BooleMatrix(A)
%BooleMatrix.m把数据转化为布尔矩阵,注意读入的数据一定是每行数据的个数一致
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
M=size(A,1); %行
N=size(A,2); %列
B=zeros(M,N);
for i=1:M
for j=1:N
B(i,A(i,j))=1; %%第i个事务,第j个属性是否是A(i,j);这个产生不重要,只是作为练习一用
end
end
end
function Ck2=candidate_prune(Ck,T,minSup)
% Ck为候选项集,本次要对其进行剪枝
% 暴力法求解,T为原数据组,开销非常大
% 方法2是枚举事务包含的项集,T为处理过的事务矩阵(1 2 3等),minSup为用于剪枝的支持度
M=size(T,1);%M个事务
m=size(Ck,1);%m个序列
s=zeros(m,1);
Ck2=[];
for i=1:m
for j=1:M %对每个事务进行搜索
if (ismember(Ck(i,:),T(j,:))) %如果第i行包含于T第j个事务
s(i)=s(i)+1;
end
end
end
s=s/M;%计算支持度
s=(s>minSup);
w=1;%另起炉灶
for i=1:m
if s(i)==1
Ck2(w,:)=Ck(i,:);
w=w+1;
end
end
end
function Apriori(T, minSup)
%T为事务矩阵,minSup为最小支持度阈值
%增加函数candidate_gen(),candidate_prune
k=1;% k为项集,先检测1-项集
M = size(T,1);%事务数
% Number of attributes in the dataset
N = size(T,2);%属性数
F=((sum(T,1)/M)>minSup);%行向量,代表每个属性是否是频繁的
T1=item(T);
w=1;%%w为计数单位
for i=1:N %F1记录1频繁序列属性编号
if ( F(i)~=0)
F1(w)=i;
w=w+1;
end
end
Ck=F1';%循环初值,并把其转置为列矩阵
while ( ~isempty(Ck))
k=k+1;
Fk=Ck;
Ck=candidate_gen(Fk);%产生候选项集
Ck=candidate_prune(Ck,T1,minSup);%剪枝候选项集
end
end
%使用方法,在最后一个Ck处做好标记
clear; clc
load mushroom.txt;
MushroomBooleMatrix=BooleMatrix(mushroom);
minSup = 0.8;
Apriori(MushroomBooleMatrix,minSup); %主函数