⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.cs

📁 apriori算法,关联规则的apriori算法
💻 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.WriteLine(DateTime.Now);
            ArrayList D = GetEventsFromDB();//事务数据集
            ArrayList I = GetItems1FromDB();//初始项目集合
            float s = 0.01f;//支持度

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

            for (int i = 0; i < L.Count; i++)
            {
                Console.WriteLine(L[i].Items);
                Console.WriteLine(L[i].Sup);
            }
            Console.WriteLine(DateTime.Now);
            Console.Read();
        }
   
        #region-----用Apriori算法进行迭代-----
        /// <summary>
        /// 用Apriori算法进行迭代
        /// </summary>
        /// <param name="D"></param>
        /// <param name="I"></param>
        /// <param name="sup"></param>
        /// <returns></returns>
        static List<ItemSet> Apriori(ArrayList D,ArrayList I,float sup)
        {
            List<ItemSet> L = new List<ItemSet>();//所有频繁项集
            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<subI.Length;m++)
                        {
                            bool subImInsubD=false;
                            for(int n=0;n<subD.Length;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) 
                    {
                        Ifrequent.Add(I[i]);
                        ItemSet iSet = new ItemSet();
                        iSet.Items=I[i].ToString();
                        iSet.Sup = Icount[i];
                        L.Add(iSet);
                    }
                }

                I.Clear();
                I = AprioriGen(Ifrequent);

                L.AddRange(Apriori(D, I, sup));
                return L;
            }
        }
            #endregion-----用Apriori算法进行迭代-----

        #region-------Apriori-gen生成候选项集---------
        /// <summary>
        /// Apriori-gen生成候选项集
        /// </summary>
        /// <param name="L"></param>
        /// <returns></returns>
        static ArrayList AprioriGen(ArrayList L)
        {
            ArrayList Lk=new ArrayList();
            Regex r=new Regex(",");
            for(int i=0;i<L.Count;i++)
            {
                string[] subL1 = r.Split(L[i].ToString());
                for(int j=i+1;j<L.Count;j++)
                {
                    string[] subL2 = r.Split(L[j].ToString());
                    //比较L中的两个项集将它们的并集暂存于temp中
                    string temp = L[j].ToString();//存储两个项集的并集
                    for(int m=0;m<subL1.Length;m++)
                    {
                        bool subL1mInsubL2=false;
                        for(int n=0;n<subL2.Length;n++)
                        {
                            if (subL1[m] == subL2[n]) subL1mInsubL2 = true;
                        }
                        if (subL1mInsubL2 == false) temp = temp + "," + subL1[m];
                    }
                    //当temp包含的项为(L中项集的大小)+1并且所求候选项集中没有与temp一样的项集
                    string[] subTemp = r.Split(temp);
                    if (subTemp.Length == subL1.Length + 1)
                    {
                        bool isExists = false;
                        for (int m = 0; m < Lk.Count; m++)
                        {
                            bool isContained = true;
                            for (int n = 0; n < subTemp.Length; n++)
                            {
                                if (!Lk[m].ToString().Contains(subTemp[n])) isContained=false;
                            }
                            if (isContained == true) isExists = true;
                        }
                        if(isExists==false) Lk.Add(temp);
                    }
                    
                }
            }
            return Lk;
        }
        #endregion-------Apriori-gen生成候选项集---------

        #region-------从数据库中得到候选一项集---------
        /// <summary>
        /// 从数据库中得到候选一项集
        /// </summary>
        /// <returns></returns>
        static ArrayList GetItems1FromDB()
        {
            string commandString = "select distinct Model from dbo.vAssocSeqLineItems";
            DataSet ds = ExcuteDataSetByCommandString(commandString);

            int countItems1 = 0;
            countItems1 = ds.Tables[0].Rows.Count;

            ArrayList Items1 = new ArrayList();
            for (int i = 0; i < countItems1; i++)
                Items1.Add(ds.Tables[0].Rows[i]["Model"].ToString());
            return Items1;
        }
        #endregion-------从数据库中得到候选一项集---------

        #region--------从数据库中获得事务集--------
        /// <summary>
        /// 从数据库中获得事务集
        /// </summary>
        /// <returns></returns>
        static ArrayList GetEventsFromDB()
        {
            string commandString="select count(OrderNumber) from vAssocSeqOrders";
            DataSet ds=ExcuteDataSetByCommandString(commandString);
            int countEvent = Convert.ToInt32(ds.Tables[0].Rows[0][0]);//获得事务的数目
            
            
            ArrayList events=new ArrayList();
            string temp=null;

            string orderNumber=null;//暂存数据表中的OrderNumber,用来判断是否是同一个Order
            //获得所有的事务
            commandString = "select OrderNumber,Model from vAssocSeqLineItems";
            ds = ExcuteDataSetByCommandString(commandString);

            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                if (orderNumber == null)//第一次读数据
                {
                    orderNumber = ds.Tables[0].Rows[i]["OrderNumber"].ToString();
                    temp = ds.Tables[0].Rows[i]["Model"].ToString();
                }
                else if (orderNumber == ds.Tables[0].Rows[i]["OrderNumber"].ToString())//读同一个Order中的数据
                {
                    temp = temp +","+ ds.Tables[0].Rows[i]["Model"];
                }
                else//读到另一个Order中的数据
                {
                    events.Add(temp);
                    orderNumber = ds.Tables[0].Rows[i]["OrderNumber"].ToString();
                    temp=ds.Tables[0].Rows[i]["Model"].ToString();
                }
                if (i == ds.Tables[0].Rows.Count - 1) events.Add(temp);
                
            }
            return events;
        }
        #endregion--------从数据库中获得事务集--------

        #region-----由指定的commandString从数据库中获得数据------
        /// <summary>
        /// 由指定的commandString从数据库中获得数据
        /// </summary>
        /// <param name="commandString"></param>
        /// <returns></returns>
        static DataSet ExcuteDataSetByCommandString(string commandString)
        {
            string connectionString = "server=.;database=AdventureWorksDW;trusted_connection=true";
            SqlConnection sqlCon = new SqlConnection(connectionString);
            sqlCon.Open();

            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.Connection = sqlCon;
            sqlCmd.CommandText = commandString;

            DataSet ds = new DataSet();
            SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCmd);
            sqlAdapter.Fill(ds);

            sqlCon.Close();
            return ds;
        }
        #endregion-----由指定的commandString从数据库中获得数据------
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -