mine_assiociation_rules.m
上传用户:cdlibang
上传日期:2016-03-24
资源大小:3k
文件大小:4k
源码类别:

其他数据库

开发平台:

Matlab

  1. function [xj,candidate]=mine_assiociation_rules(X,th,thconf)
  2. [m,n]=size(X);
  3. %频繁项集通过xj记录
  4. %xj{i}(j).element
  5. %xj{i}(j).time
  6. %其中i表示频繁i项集,j表示频繁i项集中的一个元素,element记录数据项,time记录数据项出现的次数
  7. %寻找频繁1项集
  8. k=0;
  9. for i=1:n
  10.     nm1(i)=sum(X(:,i));
  11.     if nm1(i)>=th
  12.         k=k+1;
  13.         pf1(k)=i; 
  14.         pfxj(k).element=i;
  15.         pfxj(k).time=nm1(i);
  16.     end 
  17. end
  18. xj{1}=pfxj;
  19. clear pfxj;
  20. %生成频繁2项集的候选项
  21. if k>0
  22.     l=0;
  23.     for i=1:k-1
  24.         for j=i+1:k
  25.             l=l+1;
  26.             pf{l}=[pf1(i),pf1(j)];
  27.         end
  28.     end
  29. end
  30. %判断频繁2项集
  31. nm(1:l)=0;  %记录每个候选项出现的次数
  32. for i=1:m
  33.     for j=1:l
  34.         se=pf{j};
  35.         if (X(i,se(1))==1)&(X(i,se(2))==1)
  36.             nm(j)=nm(j)+1;
  37.         end
  38.     end
  39. end
  40. k=0;
  41. %找出频繁2项集
  42. for i=1:l
  43.     if nm(i)>=th
  44.         k=k+1;
  45.         candidate{k}=pf{i};
  46.         pfxj(k).element=pf{i};
  47.         pfxj(k).time=nm(i);
  48.     end
  49. end
  50. xj{2}=pfxj;
  51. clear pfxj;
  52. %连接步,两个集合若满足连接条件,则进行连接,生成K-1项候选集 
  53. num=2;
  54. while( k>0)
  55.     le=length(candidate{1});
  56.     nl=0;
  57.     for i=1:k-1
  58.         for j=i+1:k
  59.             x1=candidate{i};
  60.             x2=candidate{j};
  61.             c = intersect(x1, x2);
  62.             if  (length(c)==le-1)  &  (sum(c==x1(1:le-1))==le-1)
  63.                 houxuan=union(x1(1:le),x2(le));
  64.                  %树剪枝,若一个候选项的某个K-1项子集为非频繁,则剪枝掉
  65.                 sub_set=subset(houxuan);
  66.                 %生成该候选项的所有K-1项子集
  67.                 NN=length(sub_set);
  68.                 %判断这些K-1项自己是否都为频繁的
  69.                 r=1; M=0;
  70.                 while(r & M<NN)
  71.                     M=M+1;
  72.                     r=in(sub_set{M},candidate);
  73.                 end
  74.                 if M==NN
  75.                    nl=nl+1;
  76.                    %候选k项集
  77.                    cand{nl}=houxuan;
  78.                 end
  79.             end
  80.         end
  81.     end
  82.     %记录每个候选k项集出现的次数
  83.     k=length(cand);
  84.     if k>0
  85.         nn(1:k)=0;
  86.         le=length(cand{1});
  87.         for i=1:m
  88.             for j=1:k
  89.                 s=cand{j};
  90.                 x=X(i,:);
  91.                 if sum(x(s))==le
  92.                     nn(j)=nn(j)+1;
  93.                 end
  94.             end
  95.         end       
  96.     end
  97.     %从候选集中找频繁项集
  98.     ll=0;
  99.     candmid=[];
  100.     for i=1:k
  101.         if nn(i)>=th
  102.             ll=ll+1;
  103.             candmid{ll}=cand{i};
  104.             pfxj(ll).element=cand{i};
  105.             pfxj(ll).time=nn(i);
  106.         end
  107.     end
  108.    k=length(candmid);
  109.    if k>0
  110.        num=num+1;
  111.        xj{num}=pfxj;
  112.        clear pfxj;
  113.        candidate=candmid;
  114.    end
  115.     cand=[];  
  116. end
  117.     disp('得到的频繁项集为:')
  118. for i=1:length(candidate)
  119.     result=num2str(candidate{i});
  120.     disp(result)
  121. end
  122. %candidate为最终得到的频繁项集,可以从中得到强规则
  123. disp('得到的强关联规则为:')
  124. %规则生成过程
  125. for j=1:length(candidate)
  126.     hx=candidate{j};
  127.     support=nn/m; %计算支持度,nn记录每个频繁项集的出现次数
  128.     le=length(hx);
  129.     subsetall=ziji(hx);%%生成每个频繁项集的所有非空、非全集子集,利用子集得到规则
  130.     for i=1:le-1
  131.         L=length(subsetall{i});
  132.         for kk=1:L
  133.             %取出一个子集,生成关联规则,并判断置信度
  134.              SS=subsetall{i}{kk};
  135.              mid1=xj{i};
  136.              ln=length(mid1);
  137.              for k=1:ln
  138.                  s=mid1(k).element;
  139.                  if sum(SS==s)==i
  140.                      conf1=mid1(k).time;
  141.                  end
  142.              end
  143.              re=num2str(SS);
  144.              confidence=nn(j)/conf1;%计算置信度
  145.              re2=num2str(setsub(hx,SS));
  146.              result=strcat(re,'=>',re2,'   support  :',num2str(support(j)),'  confidence : ',num2str(confidence));
  147.              if (confidence>=thconf)
  148.                   disp(result) %规则输出
  149.              end
  150.         end
  151.     end
  152. end