【转】关联规则数据挖掘的算法相关_土拨呼

来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:33:37
 

在做关联规则挖掘模块的时候,由频繁项集产生关联规则,需要使用到子集产生的算法。比如:
char[] A={'a','b','c','d',...},集合A中,产生所有A的子集{'a'},{'b'},{'a','b'},{'a','b','c'}...这些。

1. 我最初的实现方法

在OpenMiner的关联模块实现之处,我考虑的方法和人们思考产生子集的方法类型,既是先产生所有的单个元素的子集,然后产生2个元素的子集,然后3个的,一直到n个元素的子集。这种方法符合人们思考的方向,不容易找漏掉,但是实现起来就比较困难了。

/**
* 开始产生所有子集(非空)
*
*/
public void beginGenerateSubItemSets() {
   m_SubItemSetIndexes = new int[m_ItemIndexes.length];
   m_SubItemSetIndexes[0] = 0;
   m_SubItemSetIndexCount = 1;
}

/**
* 产生下一个子集(非空)
* @return
*/
public ItemIndexSet nextSubItemSet() {
   int i,k,j;
   int length = m_ItemIndexes.length;
  
   if(m_SubItemSetIndexCount > length)
    return null;
  
   ItemIndexSet subItemSet = new ItemIndexSet();
   subItemSet.m_ItemIndexes = new int[m_SubItemSetIndexCount];
   for(i=0;i    k = m_SubItemSetIndexes[i];
    subItemSet.m_ItemIndexes[i] = m_ItemIndexes[k];
   }
  
   j=0;
   m_SubItemSetIndexes[i-1]++;
   while(m_SubItemSetIndexes[i-j-1] >= length-j) {
    if(i-j-2 < 0) {
     m_SubItemSetIndexCount++;
     if(m_SubItemSetIndexCount <= length) {
      for(i=0;i       m_SubItemSetIndexes[i] = i;
     }
     return subItemSet;
    }
    m_SubItemSetIndexes[i-j-2]++;
    j++;
   }
   if (j > 0) {
    k = m_SubItemSetIndexes[i - j - 1];
    i = i - j;
    while (i < length)
     m_SubItemSetIndexes[i++] = ++k;
   }
  
   return subItemSet;
}

/**
* 结束产生子集(非空)的过程
*
*/
public void endGenerateSubItemSets() {
   m_SubItemSetIndexes = null;
}

我整整用了一个整数和一个数组来保存当前产生所有集合的索引,甚至还实现了一个任意进制的加法算法。

2. 高手的实现方法

最近从CSDN上看到了一个人的做法,很简单:

class Test
{
static void Main(string[] args)
{
   char[] chs = {'a','b','c','d'};
   SubSet s = new SubSet(chs);
   s.Print();
}

}
class SubSet
{
char[] chs;
int bits = 0;
public SubSet(char[] chs)
{
   this.chs = chs;
}

public void Print()
{
   for(int i = 0;i < (1<   {
    for(int j = 0; j< chs.Length; j++)
     if( ((1 << j) & i) !=0 )
      Console.Write( chs[j] );
    Console.WriteLine();
   }
}
}

里面二进制位1,0,来产生对应的集合元素。比如一个整数的所有n个bits对应集合内的n个元素,1表示该子集内包含该元素,0表示不包含。则通过一个整数的累加,肯定会把n个bits的所有1,0排列组合情况产生完成。

真是高明的做法