Apriori演算法中頻繁項目集產生演算法C語言實現

來源:互聯網
上載者:User

          資料採礦是從大量資料中分析推斷出資料規律的一種技術,它具有廣泛的應用前景,比如社交網路中好友推薦,購物網站中的商品推薦等等。資料採礦至提出到現在,已經產生了多種資料採礦演算法。其中Apriori 是一種最有影響的挖掘布爾關聯規則頻繁項集的演算法。本文使用C語言實現來一個單一最小支援度的Apriori演算法。

         行文開始之前先簡單介紹一下相關概念。設I={i1,i2,i3……im}是一個項目(Item)集合T={t1,t2,……,tm}是一個事物集合,每個事物t是一個項目集合,且t屬於I,一條關聯規則定義如下:X->Y,其中X、Y都屬於I且X與Y的交集是空集。集合T中所有包含X的事物的數目稱之為X的支持度計數(X.count),一個規則的支援度:sup=(XUY.count)/n,n是T中事物的個數。信賴度:conf=(XUY.count)/X.count。支援度決定了規則在T中出現的頻度,信賴度指出了規則的可預測度。minsup與minconf是使用者指定的滿足條件的一個最小閥值。一個頻繁項目集是指一個支援度高於minsup的項集。如何高效的從中找到滿足條件的規則,是資料採礦中一個基礎問題。如果從I中找出所有可能的規則,然後再從規則中去找,這會隨著I的基數增加而成指數規模增加,顯然不具有使用的價值。Apriori演算法通過一定的剪枝最佳化策略使得計算大大縮小。

         Apriori演算法大致分為兩步:1產生所有的頻繁項目集,2從頻繁項目集中產生所有的可信關聯規則(指它的信賴度高於minconf)。Apriori演算法基於演繹原理產生所有的頻繁項目集:如歌一個頻繁項目集滿足最小支援度要求,那麼它的所有非空子集都滿足最小支援度要求。位了簡化處理,Apriori演算法假定所有項目集中的項目都採用字典順序排列。它採用逐級搜尋的思想:先產生頻繁一項集,然後根據頻繁一項集產生頻繁而項集,依次類推,產生頻繁K項集。現給定產生頻繁K項集的Apriori演算法的虛擬碼描述:

Algorith Apriori(T)

      C1<--init-pass(T) ;對事物進行第一輪搜尋

     F1<--{f|f屬於C1,f.count>=minsup};

     for(k=2;Fk-1 nut null;k++) do

        Ck<--candidate-gen(Fk-1);//候選K項集產生函數,分為兩步:合并、減枝

       for each transzction t is one of T do

            for each candidate c is one of Ck do

                   if c is contained in t then

                          c.count++;

             endfor

         endfor

       Fk<--{c is one of Ck | c.count/n>=minsup}

   end for

 return

演算法在根據頻繁k-1項集產生頻繁K項集過程中要計算頻繁K項集中每個元素的支援度,並計算K項集中每個k-1項子集是否在Fk-1中,上述兩條任何一條不滿足,則刪去這個K項集中的元素。candidate-gen與init-pass相關的虛擬碼就不詳細給出了,同時我們在init-pass中實現頻繁一項集產生。具體代碼如下(不給出測試main函數):

//對事物進行第一次掃描,產生頻繁一項集,並返回一項集中個數int init_pass(char *item,char tran[len_t][len],int len,char res_item[len_t][len],float min_sup){float t_sup;int number=0;for(int i=0;i<len;i++){int count=0;for(int j=0;j<len_t;j++){for(int k=0;k<len;k++)if(item[i]==tran[j][k]){count++;break;}break;}t_sup=count*1.0/len;if(t_sup>=min_sup)res_item[number++][0]=item[i];}return number-1;}//產生候選K項集,返回k項集中事物的個數int candidate_gen(char ktran[len][k],char kktran[len][k+1]){char temp[k],temp1[k],ktemp[k+1];int number=0;for(int i=0;i<len;i++){strcpy(temp,ktran[i]);bool flag;for(j=i+1;j<len;j++){strcpy(temp1,ktran[i]);for(int m=0;m<k;m++){if((m<k-1 && temp[m]==temp1[m])||m==k-1){continue;flag=true;}else  {flag=false;break;}}if(flag){if(temp[k-1]>temp1[k-1]){strcpy(ktemp,temp1);ktemp[k]=temp[k-1];}else{strcpy(ktemp,temp);ktemp[k]=temp1[k-1]}break;}}flag=judge(kemp,ktran[len][k]);if(flag==true)strcpy(kktran[number++],ktemp);}return number-1;}//判斷子集是否在k項集中bool judge(char *srcstr,char desstr[len][k]){char temp[k];int count=0;for(int i=0;i<k-1;i++){for(int j=0;j<i;j++)temp[j]=srcstr[j];for(int j=i+1;j<k+1;j++)temp[j]=srcstr[j];for(int p=0;p<len;p++)if(strcmp(temp,desstr[i])==0){count++;break;}}if(count==k-1)return true;return false;}//apriori演算法int apriori(char item[len],char tran[length][len],char res_tran[length][len],float min_sup){char ttran[length][len];int number,count,t_num;for(int i=0;i<length;i++)for(int j=0;j<len;j++)ttran[i][j]='0';number=init_pass(item,tran[length][len],len,ttran[length][len],min_sup);for(int i=0i<length;i++)res_tran[i][0]=ttran[i][0];for(int k=2;number!=0;k++){t_num=number;number=candidate_gen(res_item[number][k-1],ttran[number][k]);if(k==2)continue;else{count=0;for(int i=0;i<number;i++){char temp[k];strcpy(temp,ttran[i]);bool t_flag=false;for(int j=0;j<length;j++){//求出候選K項集中每個事物的支持度計數int t_k=0;for(int n=0;n<k;n++){bool m_flag=falsefor(int g=t_k;g<len;g++){if(temp[k]==tran[j][g]){m_flag=true;t_k=g;break;}}if(m_flag==true && n==k-1)t_flag=true;}if(t_flag==true)count++;flag = false;}if(count/length > min_sup)strcpy(res_item[i],temp);count=0;}}}return t_num;}

相關的測試main函數可以自己書寫。根據頻繁k項集產生關聯規則相對簡單,只需要計算最小信賴度即可從頻繁K項集中找到所有的滿足條件的關聯規則。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.