日期:2014-05-18  浏览次数:20752 次

数据库提取数据,Apriopri 分析 (C#)
我有一个数据表,里面记录了超市客户购物信息
我想从数据库中提取客户每次购物的数据,此数据按时间分组,
每个组我用一个数组表示例如第一组 a[0][...],这样的话进行分析,
找出频繁购物序列,
我想了想,现在还没有想好,各位有什么好主意帮我分析分析

这个是别人写的Apriopri程序,我看着有点迷茫,帮我分析一下吧

ItemSet.cs 

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace testApriori1
{
  public class ItemSet
  {
  private string items;
  private int sup;
  public string Items
  {
  get { return items; }
  set { items = value; }
  }
  public int Sup
  {
  get { return sup; }
  set { sup = value; }
  }
  public ItemSet()//对象初始化
  {
  items = null;
  sup = 0;
  }
  }



TestApriori.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using System.Collections;

namespace testApriori1
{
  public class TestApriori
  {
  static void Main(string[] args)
  {
  Console.Write(DateTime.Now);
  ArrayList D = GetEventsFromDB();//事务数据集
  ArrayList I = GetItems1FromDB();//初始项目集合
  float s = 0.01f;//支持度

  List L = new List();//所有频繁项集
  L = Apriori(D, I, s);

  for (int i = 0; i < L.Count; i++)
  {
  Console.WriteLine(L[i].Items);
  Console.WriteLine(L[i].Sup);
  }
  Console.Write(DateTime.Now);
  Console.Read();
  }

#region-----用Apriori算法进行迭代-----
/// 
/// 用Apriori算法进行迭代
/// 
static List Apriori(ArrayList D,ArrayList I,float sup)
{
  List L = new List();//所有频繁项集
  if (I.Count == 0) return L;
  else
  {
  int[] Icount = new int[I.Count];//初始项集计数器,初始化为0
  ArrayList Ifrequent = new ArrayList();//初始项集中的频繁项集

  //遍历事务数据集,对项集进行计数
  Regex r=new Regex(",");
  for (int i = 0; i < D.Count; i++)
  {
  string[] subD=r.Split(D[i].ToString());
  for (int j = 0; j < I.Count;j++ )
  {
  string[] subI = r.Split(I[j].ToString());
  bool subIInsubD=true;
  for(int m=0;m
  {
  bool subImInsubD=false;
  for(int n=0;n
  if (subI[m] == subD[n]) 
  {
  subImInsubD = true; 
  continue; 
  }
  if(subImInsubD==false) subIInsubD=false;
  }
  if(subIInsubD==true) Icount[j]++;
  }
  }

  //从初始项集中将支持度大于给定值的项转到L中
  for (int i = 0; i < Icount.Length;i++ )
  {
  if (Icount[i] >= sup * D.Count) 
  {
&