`
hermitte
  • 浏览: 30322 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Apriori 购物栏挖掘算法的C#实现。原创代码

阅读更多
c# 代码
c# 代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.Collections;   
  5.   
  6.     
  7.     class Program   
  8.     {   
  9.         static void Main(string[] args)   
  10.         {   
  11.             string file = @"c:\test.csv";   
  12.             string sup = "2";   
  13.             if (args.Length > 0) {   
  14.                 file = args[0];   
  15.                    
  16.             }   
  17.             if (args.Length== 2)   
  18.             {   
  19.                 sup= args[1];   
  20.   
  21.             }   
  22.   
  23.   
  24.             double support = double.Parse(sup);   
  25.   
  26.             CSVReader cr = new CSVReader();   
  27.             ItemSet data = cr.Read(file);   
  28.   
  29.   
  30.                
  31.             Program p = new Program();   
  32.             ItemSet a= p.apriori( data, support);   
  33.             for (int i = 0; i < a.Count;i++ )   
  34.             {   
  35.                 ItemSet cur = (ItemSet)a[i];   
  36.                 for (int j = 0; j < cur.Count; j++) {   
  37.                     ItemSet now = (ItemSet)cur[j];   
  38.                     foreach (DataItem item in now)   
  39.                     {   
  40.   
  41.                         Console.Write("编号" + item.Id + ":" + item.ItemName+"  ");   
  42.   
  43.                            
  44.                     }   
  45.                     Console.WriteLine("  支持度:"+now.ICount);   
  46.                 }   
  47.   
  48.             }   
  49.               
  50.             Console.Read();   
  51.         }   
  52.   
  53.         private ItemSet FindOneColSet(ItemSet data, double support)   
  54.         {   
  55.             ItemSet cur=null;   
  56.             ItemSet result = new ItemSet();   
  57.   
  58.             ItemSet set=null;   
  59.             ItemSet newset=null;   
  60.             DataItem cd=null;   
  61.              DataItem td=null;   
  62.              bool flag = true;   
  63.   
  64.             for (int i = 0; i < data.Count; i++) {   
  65.                 cur = (ItemSet)data[i];   
  66.                 for (int j = 0; j < cur.Count; j++) {   
  67.                     cd = (DataItem)cur[j];   
  68.                        
  69.                     for (int n = 0; n < result.Count; n++) {   
  70.                         set = (ItemSet)result[n];   
  71.                         td= (DataItem)set[0];   
  72.                         if (cd.Id == td.Id)   
  73.                         {   
  74.                             set.ICount++;   
  75.                             flag = false;   
  76.                             break;   
  77.                                                                  
  78.                         }   
  79.                         flag=true;   
  80.                     }   
  81.                     if (flag) {   
  82.                         newset = new ItemSet();   
  83.                         newset.Add(cd);   
  84.                         result.Add(newset);   
  85.                         newset.ICount = 1;   
  86.                        
  87.                        
  88.                     }   
  89.   
  90.                       
  91.                        
  92.                 }   
  93.   
  94.   
  95.                    
  96.             }   
  97.             ItemSet finalResult = new ItemSet();   
  98.             for (int i = 0; i < result.Count; i++)   
  99.             {   
  100.                 ItemSet con = (ItemSet)result[i];   
  101.                 if (con.ICount >= support)   
  102.                 {   
  103.   
  104.                     finalResult.Add(con);   
  105.                 }   
  106.   
  107.   
  108.             }   
  109.             //finalResult.Sort();   
  110.             return finalResult;   
  111.      
  112.            
  113.         }   
  114.   
  115.   
  116.         private ItemSet apriori(  ItemSet data, double support)   
  117.         {   
  118.   
  119.             ItemSet result = new ItemSet();   
  120.             ItemSet li = new ItemSet();   
  121.             ItemSet conList = new ItemSet();   
  122.             ItemSet subConList = new ItemSet();   
  123.             ItemSet subDataList = new ItemSet();   
  124.             int k = 2;   
  125.             li.Add( new ItemSet());   
  126.             li.Add(this.FindOneColSet(data,support));   
  127.                
  128.             while (((ItemSet)li[k-1]).Count != 0)   
  129.             {   
  130.   
  131.                 conList = AprioriGenerate((ItemSet)li[k - 1],k-1, support);   
  132.                 for (int i = 0; i < data.Count; i++)   
  133.                 {   
  134.                     subDataList = SubSet((ItemSet)data[i], k);   
  135.                     for (int j = 0; j < subDataList.Count; j++)   
  136.                     {   
  137.                         for (int n = 0; n < conList.Count; n++)   
  138.                         {   
  139.                             ((ItemSet)subDataList[j]).Sort();   
  140.                             ((ItemSet)conList[n]).Sort();   
  141.                             if (((ItemSet)subDataList[j]).Equals(conList[n]))   
  142.                             {   
  143.                                 ((ItemSet)conList[n]).ICount++;   
  144.   
  145.                             }   
  146.                         }   
  147.                          
  148.                     }   
  149.   
  150.                 }   
  151.   
  152.                 li.Add(new ItemSet());   
  153.                 for (int i = 0; i < conList.Count; i++)   
  154.                 {   
  155.                     ItemSet con = (ItemSet)conList[i];   
  156.                     if (con.ICount >= support)   
  157.                     {   
  158.                             
  159.                         ((ItemSet)li[k]).Add(con);   
  160.                     }   
  161.   
  162.   
  163.                 }   
  164.                  
  165.                 k++;   
  166.             }   
  167.             for (int i = 0; i < li.Count; i++)   
  168.             {   
  169.                    
  170.                 result.Add(li[i]);   
  171.   
  172.                      
  173.   
  174.             }   
  175.             return result;   
  176.   
  177.   
  178.   
  179.         }   
  180.   
  181.         private ItemSet AprioriGenerate(ItemSet li,int k, double support)   
  182.         {   
  183.   
  184.             ItemSet curList = null;   
  185.             ItemSet durList = null;   
  186.             ItemSet candi = null;   
  187.             ItemSet result = new ItemSet();   
  188.             for (int i = 0; i < li.Count; i++)   
  189.             {   
  190.                 for (int j = 0; j < li.Count; j++)   
  191.                 {   
  192.                     bool flag = true ;   
  193.                     curList = (ItemSet)li[i];   
  194.                     durList = (ItemSet)li[j];   
  195.                     for (int n = 2; n < k; n++)   
  196.                     {   
  197.   
  198.                         if (((DataItem)curList[n - 2]).Id == ((DataItem)durList[n - 2]).Id)   
  199.                         {   
  200.   
  201.                             flag = true;   
  202.   
  203.                         }   
  204.                         else {   
  205.                             break;   
  206.                             flag = false;   
  207.                               
  208.                               
  209.                         }   
  210.                          
  211.   
  212.                     }   
  213.   
  214.                     if (flag && ((DataItem)curList[k - 1] ).Id< ((DataItem)durList[k - 1]).Id)   
  215.                     {   
  216.   
  217.                         flag = true;   
  218.                     }   
  219.                     else {   
  220.                         flag = false;   
  221.                     }   
  222.                     if (flag)   
  223.                     {   
  224.                         candi = new ItemSet();   
  225.                            
  226.   
  227.                         for(int m=0;m<k;m++){   
  228.                             candi.Add(durList[m]);   
  229.                            
  230.                         }   
  231.                         candi.Add(curList[k-1]);   
  232.   
  233.   
  234.   
  235.   
  236.   
  237.                         if (HasInFrequentSubset(candi, li,k))   
  238.                         {   
  239.                             candi.Clear();   
  240.   
  241.                         }   
  242.                         else  
  243.                         {   
  244.                             result.Add(candi);   
  245.                         }   
  246.                     }   
  247.   
  248.                 }   
  249.             }   
  250.             return result;   
  251.   
  252.         }   
  253.   
  254.   
  255.            
  256.         private bool HasInFrequentSubset(ItemSet candidate, ItemSet li,int k)   
  257.         {   
  258.             ItemSet subSet = SubSet(candidate,k);   
  259.             ItemSet curList = null;   
  260.             ItemSet liCurList = null;   
  261.            
  262.             for (int i = 0; i < subSet.Count; i++)   
  263.             {   
  264.                 curList = (ItemSet)subSet[i];   
  265.                 for (int j = 0; j < li.Count; j++)   
  266.                 {   
  267.   
  268.                     liCurList = (ItemSet)li[j];   
  269.                     if (liCurList.Equals(curList))   
  270.                     {   
  271.                        return false;   
  272.   
  273.                     }   
  274.                       
  275.                 }   
  276.             }   
  277.             return true;;   
  278.         }   
  279.         //划分子集   
  280.         private ItemSet SubSet(ItemSet set)   
  281.         {   
  282.             ItemSet subSet = new ItemSet();   
  283.   
  284.             ItemSet itemSet = new ItemSet();   
  285.             //移位求2n次访   
  286.             int num = 1 << set.Count;   
  287.   
  288.             int bit;   
  289.             int mask = 0; ;   
  290.             for (int i = 0; i < num; i++)   
  291.             {   
  292.                 itemSet = new ItemSet();   
  293.                 for (int j = 0; j < set.Count; j++)   
  294.                 {   
  295.                     //mask与i可以得出某位是否为零   
  296.                     mask = 1 << j;   
  297.                     bit = i & mask;   
  298.                     if (bit > 0)   
  299.                     {   
  300.   
  301.                         itemSet.Add(set[j]);   
  302.   
  303.                     }   
  304.                 }   
  305.                 if (itemSet.Count > 0)   
  306.                 {   
  307.                     subSet.Add(itemSet);   
  308.                 }   
  309.   
  310.   
  311.             }   
  312.   
  313.   
  314.   
  315.             return subSet;   
  316.         }   
  317.   
  318.   
  319.   
  320.         //划分子集   
  321.         private ItemSet SubSet(ItemSet setint t)   
  322.         {   
  323.             ItemSet subSet = new ItemSet();   
  324.   
  325.             ItemSet itemSet = new ItemSet();   
  326.             //移位求2n次访   
  327.             int num = 1 << set.Count;   
  328.   
  329.             int bit;   
  330.             int mask = 0; ;   
  331.             for (int i = 0; i < num; i++)   
  332.             {   
  333.                 itemSet = new ItemSet();   
  334.                 for (int j = 0; j < set.Count; j++)   
  335.                 {   
  336.                     //mask与i可以得出某位是否为零   
  337.                     mask = 1 << j;   
  338.                     bit = i & mask;   
  339.                     if (bit > 0)   
  340.                     {   
  341.   
  342.                         itemSet.Add(set[j]);   
  343.   
  344.                     }   
  345.                 }   
  346.                 if (itemSet.Count == t)   
  347.                 {   
  348.                     subSet.Add(itemSet);   
  349.                 }   
  350.   
  351.   
  352.             }   
  353.   
  354.   
  355.   
  356.             return subSet;   
  357.         }   
  358.     }   
  359.     
分享到:
评论
4 楼 aimilo2008 2008-09-21  
我对数据挖掘也很感兴趣,可否告诉我以后的一个方向或者你的体会,谢谢
3 楼 takitesy 2007-06-20  
你好,请问一下你用的ItemSet和DataItem是什么数据结构阿?自己写的结构吗?另外第69行中result数据集是个刚初始化的ItemSet,这里对它的操作( for (int n = 0; n < result.Count; n++)... )是否有问题?
2 楼 hermitte 2007-02-02  
数据库中的知识发现 (Knowledge Discovery in Databases,KDD) 是利用计算机自动地从海量信息中提取有用的知识 , 是一种有效利用信息的新方法 , 目前已成为数据库领域的研究热点之一。 KDD 的研究焦点在于数据挖掘。数据挖掘是从大型数据库或数据仓库中提取人们感兴趣的知识 , 这些知识是隐含的 , 事先未知的潜在的有用信息。主要包括的方法有 : 分类、回归分析、聚类、关联分析等 [1][5] 。关联规则的提取主要针对大型事务数据库。由于关联规则提取需要重复扫描数据库 , 因而提高算法的效率是至关重要的。

1 关联规则的基本概念

假设 I={i1 ,i2 ,…,im} 是所有项的集合 , 相当于商品的所有种类的集合 ,D 是所有事务的集合 , 也即数据库中记录的集合 , 事务 T={t1 ,t2 , … ,tn},ti ∈ I, 相当于交易中的商品列表 . 若 X 、 Y 是数据项集 ,X 中含有的项数目为 K, 则称为 K- 数据项集 .

事务集 D 中的规则 X Y( 其中 X I,Y I,X ∩ Y= Φ ) 是由支持度 (support) 和确信度 (confidence) 约束的 , 支持度表示规则的频度 , 确信度表示规则的强度 .

规则 X Y 在交易数据库 D 中的支持度是交易集中同时包含 XY 的交易数与所有交易数之比 , 记为 support(X Y)=|{T:X ∪ Y T,T ∈ D}|/|D|。

规则 X Y 在交易数据库 D 中的可信度是交易集中同时包含 XY 的交易数与包含 X 的交易数之比 , 记为 confidence(X Y)=|{T:X ∪ Y T,T ∈ D}|/|{T:X T,T ∈ D}|。

给定一个交易集 D, 挖掘关联规则问题就是产生支持度和可信度分别大于用户给定的最小支持度 (minsupp) 和最小确信度 (minconf) 的关联规则 . 当规则的确信度和支持度分别大于 minsupp 、 minconf 时 , 我们认为规则是有效的 , 称为强关联规则 . 当数据项集 X 的支持度大于 minsupp 时 , 称 X 为高频数据项集 .

2 Apriori算法

??? Agrawal等在1993年设计了一个基本算法Apriori[4],为生 成所有频繁项集,Apriori使用了递推的方法,其核心思想是:

(1) L1 = find_frequent_1-itemsets(D);

(2) for (k=2;Lk-1 ≠Φ ;k++) {

(3)  Ck = apriori_gen(Lk-1 ,min_sup);

(4)  for each transaction t ∈ D {//scan D for counts

(5)  Ct = subset(Ck,t);//get the subsets of t that are candidates

(6) for each candidate c ∈ Ct

(7) c.count++;

(8)  }

(9)? ?Lk ={c ∈ Ck|c.count≥min_sup}

(10) }

(11) return L= ∪ k Lk;

首先扫描一次数据库,产生频繁1项集 L1 ;然后进行循环,在第k次循环中,首先由频繁k-1项集进行自连接和剪枝产生候选频繁k项集 Ck ,然后使用 Hash 函数把 Ck 存储到一棵树上,扫描数据库,对每一个交易T使用同样的 Hash 函数,计算出该交易T内包含哪些候选频繁k项集,并对这些候选频繁k项集的支持数加1,如果某个候选频繁k项集的支持数大于或等于最小支持数,则该候选频繁k项集为频繁k项集;该循环直到不再产生候选频繁k项集结束。

Apriori算法的缺点:(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。

3 几种改进的算法思想

虽然 Apriori 算法自身已经进行了一定的优化,但是在实际的应用中,仍存在不尽人意之处,于是相继出现了一些优化的方法,例如:

a. 基于划分的方法 . Savasere 等提出了一种基于划分 (partition) 算法 , 该算法首先将数据库从逻辑上分成几个互不相交的块 , 每次单独考虑一个分块并生成所有的频集 , 然后把产生的频集合并 , 用来生成所有可能的频集 , 最后计算这些项集的支持度 .

b. 基于 Hash 的方法 . 通过实验可以发现寻找频集主要的计算是在生成频繁 2_ 项集 L K 上 ,

Park 等利用这一性质引入 Hash 技术来改进产生频繁 2_ 项集的方法 .

c. 基于采样的方法 . 对上一遍扫描得到的信息进行仔细的组合分析 , 可以得到改进的算法 .Toivonen 进一步发展了这个思想 , 他首先使用从数据库中抽取出来的、由采样得到的一些在整个数据库中可能成立的规则 , 然后用数据库的剩余部分验证这些规则 .

d. 减少交易的个数 . 减少用于未来扫描的事务集的大小 , 其基本原理是:若一个事务不包含长度为 k 的大项集 , 则必然不包含长度为 k+1 的大项集 . 因此可以将这些事务移去 , 这样就减少了下一遍扫描中扫描的事务集的个数 , 这就是 Apriori-Tid 的基本思想 .

下面介绍几个改进算法的思想:

3.1 减少数据库内事务的方法

从 Apriori 算法可以看出 , 对每一 C i 均对数据库扫描一次 , 而这时有些事务已经对频繁项集的生成不产生作用 , 减少数据库 D 内不起作用的事务对于算法来说是很有必要的 , 本算法的基本思想就基于此。文 [6] 中对此进行了刻划 , 文 [6] 的算法是在每次计算 C i 支持记数的过程中 , 给不包含 C i 中的任何项集的事务打上删除标记 , 在以后的扫描计数中不加考虑。其实在 C i 扫描过数据库后 , 与 C i 中某一项集相同的事务 t , 如果其支持记数小于 Vmin_sup , 这一事务对后面的频繁项集将不产生作用 , 因此它也可以从数据库中删去。本算法通过增加这一事实 , 得出的算法比 [6] 中算法更有效。随着 i 值的增大 , 删除的事务也不断增大 , 因而有效降低了候选项集的计数速度 , 提高了整个算法的效率。

本算法命名为 DDApriori 算法 [7] , 描述如下:

算法: DDApriori 使用根据候选生成的逐行迭代找出频繁项集。

  输入:事务数据库 D ;最小支持记数阈值 Vmin_sup 。

  输出: D 中的频繁项集 L 。

  方法:

10)   L 1 =find_frequent_1- itemsets(D) ;

20)   for (i = 2 ;L i - 1 ≠ ¢ ;i ++ ) {

30)   C k = apriori_gen(L i - 1 ,Vmin_sup) ; ‖产生新的候选项集 , 此函数同于 Apriori 算法中的函数

40)   for each transaction t ∈ D{ ‖扫描 D 并计数

41)      if t . delete = 0 then do begin

50)       C t = subset (C i ,t) ; ‖获取 t 的子集作为候选

51)      if C t = ¢ then

52)       t . delete = 1 ‖打上删除标志

53)      else ‖对每一个 Ct 进行计数并记录内容

54)       if C t = c then t . count ++ ,t . text = c

60)       for each candidate c ∈ C t .

70)       c. count ++ ;

71)     end

80)   }

81)   if 0 < t . count and t.text.count < Vmin_sup then

82)   t . delete = 1 ‖去掉已无作用的事务 t

90)   L i = {c ∈ C i | c. count ≥ Vmin_sup} ‖得到满足条件的 L i

100) }

110) return L = ∪ i L i ;

这个是《数据挖掘概念与技术》中的
1 楼 ouspec 2007-02-02  
Apriori 算法能概叙一下么?

相关推荐

    Apriori 数据挖掘算法的C#实现

    数据库中的知识发现 (Knowledge Discovery in Databases,KDD) 是利用计算机自动地从海量信息中提取有用的知识 , 是一种有效利用信息的新方法...由于关联规则提取需要重复扫描数据库 , 因而提高算法的效率是至关重要的。

    超详细!基于 Apriori 关联规则挖掘算法实现商品购物篮分析(数据+代码+5k字项目报告)

    Apriori 算法是关联规则挖掘的经典算法之一,尤其在零售业中的商品购物篮分析中应用广泛。本项目深入探讨了如何利用 Apriori 算法来揭示消费者购买行为的模式。 首先,我们要理解 Apriori 算法的基本原理。Apriori ...

    Apriori算法C#实现

    Apriori算法是一种经典的关联规则挖掘算法,最初由 Agrawal 和 Srikant 在1994年提出,主要用于从大规模交易数据集中发现频繁项集和强关联规则。在这个C#实现的Form程序中,我们可以深入理解Apriori算法的工作原理和...

    C#实现Apriori算法

    Apriori算法是一种经典的关联规则学习算法,常用于数据挖掘中的频繁项集发现。这个算法由R. Agrawal和R. Srikant在1994年提出,它的核心思想是通过迭代的方式找到数据库中频繁出现的项集,并基于这些频繁项集生成强...

    Apriori 算法C#实现

    总的来说,这个项目提供了C#实现Apriori算法的机会,可以帮助你深入理解数据挖掘中的关联规则学习,同时提升C#编程技能和数据库操作能力。通过实际动手操作,你将能够掌握如何在实际场景中应用这些知识。

    C# Apriori算法的实现

    在提供的压缩包文件中,很可能是包含了C#实现Apriori算法的源代码,你可以通过阅读和分析代码来学习如何将理论转化为实际的程序逻辑。代码可能包括以下关键部分: 1. `Apriori`类:作为算法的主入口,包含初始化、...

    关联规则挖掘算法apriori算法的实现

    在给定的文件名"apriori2"中,可能包含了Apriori算法的第二阶段实现,即候选集生成和剪枝过程的代码或者结果。这个阶段通常是算法中最耗时的部分,因为它涉及到大量的集合操作和计数。 总之,Apriori算法是关联规则...

    用C#实现Apriori算法

    文件名“用C#实现Apriori算法”表明压缩包中可能包含了源代码文件,这些文件展示了如何在C#环境中具体实现上述步骤。可能包括了主程序类、数据访问类、算法实现类以及其他辅助类。通过研究这些代码,开发者可以了解...

    基于MapReduce的Apriori算法代码

    基于MapReduce的Apriori算法代码是一个使用Hadoop MapReduce框架实现的关联规则挖掘算法,称为Apriori算法。Apriori算法是一种经典的关联规则挖掘算法,用于发现事务数据库中频繁出现的项集。该算法的主要思想是生成...

    Apriori算法代码实现

    数据挖掘关联规则的挖掘 Apriori的c代码实现,分享给大家

    csharp-apriori.rar_Apriori_C sharp_Sharp_apriori c#_apriori算法c#

    在C#代码中,可以使用`Dictionary`或`HashSet`来存储频繁项集和候选集,用`List`或`LinkedList`来维护交易列表。`Linq`查询可以方便地进行数据处理和筛选,而多线程或`Task`可以帮助优化计算性能。 此外,为了提高...

    Apriori算法c#实现

    Apriori算法是一种经典的关联规则学习算法,广泛应用于数据挖掘领域,主要用于发现数据库...通过阅读和分析这些代码,可以更深入地理解Apriori算法的C#实现细节。对于学习和实践数据挖掘的人来说,这是一个宝贵的资源。

    Apriori关联规则挖掘 C#

    本篇将深入探讨Apriori算法以及如何使用C#语言实现它。 关联规则通常表述为:“如果事件A发生,那么事件B也有可能发生”。例如,在超市购物数据中,可能会发现“如果顾客购买了尿布,他们也常常会购买啤酒”,这...

    Apriori算法Python实现

    Apriori算法Python实现

    C#实现超市数据挖掘的Apriori算法

    总的来说,C#实现的Apriori算法结合VS2010和SQL2008,提供了一套高效的数据挖掘解决方案,对于理解超市购物行为,提升商业智能具有重要作用。通过实际项目开发,不仅可以掌握Apriori算法,还能提升C#编程和数据库...

    Apriori关联规则挖掘算法研究.pdf

    Apriori关联规则挖掘算法研究 Apriori关联规则挖掘算法是目前使用最为广泛的关联规则挖掘算法之一,该算法可以从海量的数据中挖掘出隐藏的、人们感兴趣的知识。该算法的实现流程可以分为两个步骤:首先,找出数据库...

    Apriori算法及其改进算法

    在Java代码中,Apriori算法的实现主要包括以下几个部分: 1. 数据读取:使用BufferedReader读取文件中的数据,并将其转换为项set的形式。 2. 项set生成:使用HashMap和ArrayList来生成所有可能的项set。 3. 支持度...

    数据挖掘算法:apriori源代码,聚类算法

    数据挖掘算法:文件夹中包括apriori源代码,聚类算法的描述,供数据挖掘算法有兴趣的人学习

    Apriori 关联挖掘算法java实现

    数据挖掘算法, 关联规则挖掘算法apriori的Java实现。

Global site tag (gtag.js) - Google Analytics