示例#1
0
        public static List <AssociationRule> Mine(ItemsetCollection db, ItemsetCollection L, double confidenceThreshold)
        {
            List <AssociationRule> allRules = new List <AssociationRule>();

            foreach (Itemset itemset in L)
            {
                ItemsetCollection subsets = Bit.FindSubsets(itemset, 0); //get all subsets
                foreach (Itemset subset in subsets)
                {
                    double confidence = (db.FindSupport(itemset) / db.FindSupport(subset)) * 100.0;
                    if (confidence >= confidenceThreshold)
                    {
                        AssociationRule rule = new AssociationRule();
                        rule.X.AddRange(subset);
                        rule.Y.AddRange(itemset.Remove(subset));
                        rule.Support    = db.FindSupport(itemset);
                        rule.Confidence = confidence;
                        if (rule.X.Count > 0 && rule.Y.Count > 0)
                        {
                            allRules.Add(rule);
                        }
                    }
                }
            }

            return(allRules);
        }
示例#2
0
        public static ItemsetCollection FindSubsets(Itemset itemset, int n)
        {
            ItemsetCollection subsets = new ItemsetCollection();

            int subsetCount = (int)Math.Pow(2, itemset.Count);

            for (int i = 0; i < subsetCount; i++)
            {
                if (n == 0 || GetOnCount(i, itemset.Count) == n)
                {
                    string binary = DecimalToBinary(i, itemset.Count);

                    Itemset subset = new Itemset();
                    for (int charIndex = 0; charIndex < binary.Length; charIndex++)
                    {
                        if (binary[charIndex] == '1')
                        {
                            subset.Add(itemset[charIndex]);
                        }
                    }
                    subsets.Add(subset);
                }
            }

            return(subsets);
        }
示例#3
0
        public static ItemsetCollection DoApriori(ItemsetCollection db, double supportThreshold)
        {
            Itemset           I  = db.GetUniqueItems();
            ItemsetCollection L  = new ItemsetCollection(); //resultant large itemsets
            ItemsetCollection Li = new ItemsetCollection(); //large itemset in each iteration
            ItemsetCollection Ci = new ItemsetCollection(); //pruned itemset in each iteration

            //first iteration (1-item itemsets)
            foreach (string item in I)
            {
                Ci.Add(new Itemset()
                {
                    item
                });
            }

            //next iterations
            int k = 2;

            while (Ci.Count != 0)
            {
                //set Li from Ci (pruning)
                Li.Clear();
                foreach (Itemset itemset in Ci)
                {
                    itemset.Support = db.FindSupport(itemset);
                    if (itemset.Support >= supportThreshold)
                    {
                        Li.Add(itemset);
                        L.Add(itemset);
                    }
                }

                //set Ci for next iteration (find supersets of Li)
                Ci.Clear();
                Ci.AddRange(Bit.FindSubsets(Li.GetUniqueItems(), k)); //get k-item subsets
                k += 1;
            }

            return(L);
        }
        private DataTable Luat_Ket_Hop_Tung_Mat_Hang_Luu_Chart(float minsup, float minconf, string chuoi)
        {
            //mlvDanhSachMH.Items.Clear();
            chuoi = chuoi.Trim();
            //Tách từng nhóm.
            string where = "'" + chuoi[0].ToString();
            for (int i = 1; i < chuoi.Length; i++)
            {
                if (chuoi[i] != ' ' && chuoi[i] != '-')
                {
                    where = where + "','" + chuoi[i].ToString();
                }
            }
            where = where + "'";

            string    lenh = "Select Distinct tblCTHoaDon.mahd from tblSanPham, tblCTHoaDon where tblCTHoaDon.masp = tblSanPham.masp and tblSanPham.manhom in(" + where + ")";
            DataTable dtHD = Connect_Database.Doc_Bang(lenh);

            lenh = "Select Distinct tblSanPham.masp from tblSanPham,tblCTHoaDon where tblCTHoaDon.masp=tblSanPham.masp and tblSanPham.manhom in(" + where + ")";
            DataTable dtMasp = Connect_Database.Doc_Bang(lenh);

            dtMasp.Columns.Add("tam", typeof(string));
            string[] anpha = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            for (int i = 0; i < dtMasp.Rows.Count; i++)
            {
                dtMasp.Rows[i]["tam"] = anpha[i];
            }

            //Xử lý kết nối các Transaction.
            List <string> trans = new List <string>();

            for (int i = 0; i < dtHD.Rows.Count; i++)
            {
                string    mahd = dtHD.Rows[i]["mahd"].ToString().Trim();
                DataTable dthd = Connect_Database.Doc_Bang("select tblCTHoaDon.mahd, tblCTHoaDon.masp from tblCTHoaDon, tblSanPham where tblSanPham.masp = tblCTHoaDon.masp and tblCTHoaDon.mahd = '" + mahd + "'");
                string    str  = "";
                for (int j = 0; j < dthd.Rows.Count; j++)
                {
                    for (int k = 0; k < dtMasp.Rows.Count; k++)
                    {
                        if (dtMasp.Rows[k]["masp"].ToString().Trim() == dthd.Rows[j]["masp"].ToString().Trim())
                        {
                            if (!str.Contains(dtMasp.Rows[k]["tam"].ToString().Trim()))
                            {
                                str = str + dtMasp.Rows[k]["tam"].ToString().Trim();
                                k   = dtMasp.Rows.Count;
                            }
                        }
                    }
                }
                trans.Add(str);
            }

            //xứ lý thuật toán Apriori
            ItemsetCollection db = new ItemsetCollection();

            for (int i = 0; i < trans.Count(); i++)
            {
                string aa = trans.ElementAt(i).Trim();
                //string[] mang =new string[aa.Length];
                Itemset itemtraining = new Itemset();
                for (int j = 0; j < aa.Length; j++)
                {
                    itemtraining.Add(aa[j].ToString());
                }
                // mang[j] = aa[j].ToString();
                db.Add(itemtraining);
            }


            Itemset           uniqueItems = db.GetUniqueItems();
            ItemsetCollection L           = AprioriMining.DoApriori(db, minsup);

            //mlvDanhSachMH.View = View.Details;
            //mlvDanhSachMH.GridLines = true;
            //mlvDanhSachMH.FullRowSelect = true;
            DataTable dtkq = new DataTable();

            dtkq.Columns.Add("Luat", typeof(string));
            dtkq.Columns.Add("Confidence", typeof(string));
            ////Thêm tiêu đề cho cột.
            //mlvDanhSachMH.Columns.Add("Tập luật kết hợp", 450);
            //mlvDanhSachMH.Columns.Add("Min_conf", 70);
            //test mining
            List <AssociationRule> allRules = AprioriMining.Mine(db, L, minconf);

            Console.Write("\n" + allRules.Count + " rules\n");
            foreach (AssociationRule rule in allRules)
            {
                string   s = rule.ToString();
                string[] a = s.Split(':');
                if (a[2] != "" && float.Parse(a[1]) >= minsup && float.Parse(a[2]) >= minconf)
                {
                    string ss = "{";
                    a[0] = a[0].Replace('{', ' ');
                    a[0] = a[0].Replace('}', ' ');
                    a[0] = a[0].Trim();
                    string[] aaa  = a[0].Split('-');
                    string   sss1 = Doi_Sang_Masp(dtMasp, aaa[0]);
                    string   sss2 = Doi_Sang_Masp(dtMasp, aaa[1]);
                    if (sss1.Trim() != "" && sss2.Trim() != "")
                    {
                        ss = sss1 + " => " + sss2;
                        DataRow dr = dtkq.NewRow();
                        dr[0] = ss;
                        dr[1] = float.Parse(a[2]);
                        dtkq.Rows.Add(dr);
                        //ListViewItem lstItem1 = new ListViewItem();
                        //lstItem1.SubItems[0].Text = ss;
                        //lstItem1.SubItems.Add(a[2] + "%");
                        //mlvDanhSachMH.Items.Add(lstItem1);
                    }
                }
                //Console.Write(rule + "\n");
            }

            return(dtkq);
        }
        private void btnApriori_Click(object sender, EventArgs e)
        {
            mlvTapPhoBien.Clear();
            mlvTapLuatKH.Clear();
            mlvDanhSachMH.Clear();

            mang_luu = new List <string>();
            if ((DataTable)dgvLoadDSHoaDon.DataSource == null)
            {
                MetroFramework.MetroMessageBox.Show(this, "Vui lòng import dữ liệu.");
            }
            else
            {
                DataTable dt = ((DataTable)dgvLoadDSHoaDon.DataSource).Clone();
                dt.Columns.Add("tam", typeof(string));

                float minsup  = 0;
                float minconf = 0;

                if (txtMinSupp.Text.Trim() == "")
                {
                    MetroFramework.MetroMessageBox.Show(this, "Vui lòng nhập độ phổ biến.");
                    return;
                }

                minsup = (float)(float.Parse(txtMinSupp.Text) / 100.0);

                if (txtMinConf.Text.Trim() == "")
                {
                    MetroFramework.MetroMessageBox.Show(this, "Vui lòng nhập độ hổ trợ.");
                    return;
                }

                minconf = (float)(float.Parse(txtMinConf.Text) / 100.0);

                if (float.Parse(txtMinSupp.Text) > float.Parse(txtMinConf.Text))
                {
                    MetroFramework.MetroMessageBox.Show(this, "Không có luật kết hợp thỏa điều kiện.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    lblTongTLKH.Text = "0";
                    lblTongTPB.Text  = "0";
                    return;
                }

                //Bắt đầu thuật toán Apriori.
                List <string> item   = new List <string>();
                DataTable     dtdata = Connect_Database.Doc_Bang("Select Distinct manhom From tblSanPham");
                for (int i = 0; i < dtdata.Rows.Count; i++)
                {
                    item.Add(dtdata.Rows[i]["manhom"].ToString().Trim());
                }

                //xử lý kết nối các Transaction
                List <string> trans   = new List <string>();
                DataTable     dtnguon = Connect_Database.Doc_Bang("select Distinct mahd from tblCTHoaDon");
                for (int i = 0; i < dtnguon.Rows.Count; i++)
                {
                    string    mahd = dtnguon.Rows[i]["mahd"].ToString().Trim();
                    DataTable dthd = Connect_Database.Doc_Bang("select tblCTHoaDon.mahd, tblCTHoaDon.masp, tblSanPham.manhom from tblCTHoaDon, tblSanPham where tblSanPham.masp=tblCTHoaDon.masp and tblCTHoaDon.mahd='" + mahd + "'");
                    string    str  = "";
                    for (int j = 0; j < dthd.Rows.Count; j++)
                    {
                        if (!str.Contains(dthd.Rows[j]["manhom"].ToString().Trim())) //kiêm tra nhóm
                        {
                            str = str + dthd.Rows[j]["manhom"].ToString().Trim();
                        }
                    }
                    trans.Add(str);
                }

                //xứ lý thuật toán Aprirori
                ItemsetCollection db = new ItemsetCollection();
                for (int i = 0; i < trans.Count(); i++)
                {
                    string aa = trans.ElementAt(i).Trim();
                    //string[] mang =new string[aa.Length];
                    Itemset itemtraining = new Itemset();
                    for (int j = 0; j < aa.Length; j++)
                    {
                        itemtraining.Add(aa[j].ToString());
                    }
                    // mang[j] = aa[j].ToString();
                    db.Add(itemtraining);
                }
                mlvTapPhoBien.View          = View.Details;
                mlvTapPhoBien.GridLines     = true;
                mlvTapPhoBien.FullRowSelect = true;

                //Thêm tiêu đề cho cột.
                mlvTapPhoBien.Columns.Add("Tập phổ biến", 205);
                mlvTapPhoBien.Columns.Add("Min_supp", 90);
                Itemset           uniqueItems = db.GetUniqueItems();
                ItemsetCollection L           = AprioriMining.DoApriori(db, minsup);
                Console.Write("\n" + L.Count + " itemsets in L\n");
                foreach (Itemset i in L)
                {
                    string   s = i.ToLuat();
                    string[] a = s.Split(':');
                    if (a[1].Trim() != "" && float.Parse(a[1]) >= minsup * 100)
                    {
                        ListViewItem lstItem1 = new ListViewItem();
                        string       ss       = Xu_ly_chuoi(a[0].Trim());

                        lstItem1.SubItems[0].Text = ss;
                        lstItem1.SubItems.Add(a[1] + "%");
                        mlvTapPhoBien.Items.Add(lstItem1);
                    }

                    //Đếm tổng số tập phổ biến trong danh mục sản phẩm.
                    lblTongTPB.Text = "" + mlvTapPhoBien.Items.Count;
                }

                mlvTapLuatKH.View          = View.Details;
                mlvTapLuatKH.GridLines     = true;
                mlvTapLuatKH.FullRowSelect = true;

                //Thêm tiêu đề cho cột
                mlvTapLuatKH.Columns.Add("Tập luật kết hợp", 300);
                mlvTapLuatKH.Columns.Add("Min_conf", 70);
                //test mining
                List <AssociationRule> allRules = AprioriMining.Mine(db, L, minconf);
                Console.Write("\n" + allRules.Count + " rules\n");

                bool kq_kt = false;

                foreach (AssociationRule rule in allRules)
                {
                    string   s = rule.ToString();
                    string[] a = s.Split(':');
                    if (a[2] != "" && float.Parse(a[1]) >= minsup * 100 && float.Parse(a[2]) >= minconf * 100)
                    {
                        string ss = "{";
                        a[0] = a[0].Replace('{', ' ');
                        a[0] = a[0].Replace('}', ' ');
                        a[0] = a[0].Trim();
                        string[] aaa  = a[0].Split('-');
                        string   sss1 = Xu_ly_chuoi(aaa[0]);
                        string   sss2 = Xu_ly_chuoi(aaa[1]);
                        ss = sss1 + " => " + sss2;
                        mang_luu.Add(a[0]);
                        ListViewItem lstItem1 = new ListViewItem();
                        lstItem1.SubItems[0].Text = ss;
                        lstItem1.SubItems.Add(a[2] + "%");
                        mlvTapLuatKH.Items.Add(lstItem1);

                        //Đếm tổng số luật kết hợp trong danh mục sản phẩm.
                        lblTongTLKH.Text = "" + mlvTapLuatKH.Items.Count;

                        kq_kt = true;
                    }


                    //Console.Write(rule + "\n");
                }

                if (!kq_kt)
                {
                    MetroFramework.MetroMessageBox.Show(this, "Không có luật kết hợp thỏa điều kiện.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }