Exemple #1
0
            public void Add(List <string> items, int index)
            {
                if (index >= items.Count)
                {
                    return;
                }

                string item = items[index];

                if (Item == item)
                {
                    Count++;
                    Add(items, ++index);
                    return;
                }

                if (_childs == null)
                {
                    _childs = new Dictionary <string, FPNode>();
                }

                if (_childs.ContainsKey(item) == false)
                {
                    _childs[item] = new FPNode(item);
                }

                _childs[item].Add(items, index);
            }
Exemple #2
0
        private void CalculateSupport(FPNode tree, double minSupport)
        {
            // 已經有資料不重新計算
            if (_resultDict.Count > 0 && _minSupport == minSupport)
            {
                return;
            }

            _sw.Reset();
            _sw.Start();

            try
            {
                // Get id from the items
                //List<ItemKey> itemKeys = _dataset.GetAllCombinationIds();
                //GetSupport(itemKeys, minSupport);

                // todo: 遞迴找 頻繁資料集的步驟未完成
                //var record = new AprioriRecord(itemKey, count);
                //_resultDict[itemKey.CombinationId] = record;
            }
            finally
            {
                _sw.Stop();
                _timeDict[nameof(CalculateSupport)] = _sw.Elapsed.TotalMilliseconds;
            }
        }
Exemple #3
0
        private FPNode CreateFPTree(ShoppingRecords2 supDataset)
        {
            var root = new FPNode("root");

            foreach (ShoppingRecord2 record in supDataset.Data.Values)
            {
                root.Add(record.Items, 0);
            }

            return(root);
        }
        public void testNewFPDictNumber()
        {
            setEscenario4();
            FPNode raiz = prueba.Raiz;

            Assert.AreEqual(raiz.hijos.Count, 2);
            FPNode prim = raiz.hijos["b"];
            FPNode sec  = raiz.hijos["d"];

            Assert.AreEqual(prim.Identificador, "b");
            Assert.AreEqual(prim.Ocurrencia, 7);
            Assert.AreEqual(prim.hijos.Count, 2);

            Assert.AreEqual(sec.Identificador, "d");
            Assert.AreEqual(sec.Ocurrencia, 3);
            Assert.AreEqual(sec.hijos.Count, 0);

            FPNode prim1 = prim.hijos["c"];

            Assert.AreEqual(prim1.Identificador, "c");
            Assert.AreEqual(prim1.Ocurrencia, 4);
            Assert.AreEqual(prim1.hijos.Count, 0);

            FPNode prim2 = prim.hijos["d"];

            Assert.AreEqual(prim2.Identificador, "d");
            Assert.AreEqual(prim2.Ocurrencia, 3);
            Assert.AreEqual(prim2.hijos.Count, 0);

            Dictionary <string, FPNode> listas = prueba.primeroListaEnlazada;

            Assert.AreEqual(listas.Count, 3);
            FPNode B1 = listas["b"];

            Assert.AreEqual(B1, prim);
            Assert.IsNull(B1.Siguiente);

            FPNode C1 = listas["c"];

            Assert.AreEqual(C1, prim1);
            Assert.IsNull(C1.Siguiente);

            FPNode D1 = listas["d"];

            Assert.AreEqual(D1, sec);
            FPNode D2 = D1.Siguiente;

            Assert.AreEqual(D2, prim2);
            Assert.IsNull(D2.Siguiente);
        }
Exemple #5
0
        public double GetResult(double minSupport, List <string> boughtItemIds, List <string> forecastItemIds)
        {
            // Scan Data
            var    itemKeys   = _dataset.GetSortHeaderTable();
            var    supDataset = _dataset.GetFilter(itemKeys);
            FPNode tree       = CreateFPTree(supDataset);

            CalculateSupport(tree, minSupport);

            _sw.Reset();
            _sw.Start();

            try
            {
                // todo: 排序項目, 計算機率
                var boughtKey   = new ItemKey(boughtItemIds);
                int boughtCount = _resultDict.ContainsKey(boughtKey.CombinationId) ?
                                  _resultDict[boughtKey.CombinationId].Count : 0;

                if (boughtCount == 0)
                {
                    return(0);
                }

                var allIds   = boughtItemIds.Concat(forecastItemIds).ToList();
                var allKey   = new ItemKey(allIds);
                int allCount = _resultDict.ContainsKey(boughtKey.CombinationId) ?
                               _resultDict[allKey.CombinationId].Count : 0;

                return(allCount / (boughtCount / 1d));   // 轉成 double
            }
            finally
            {
                _sw.Stop();
                _timeDict[nameof(GetResult)] = _sw.Elapsed.TotalMilliseconds;
            }
        }
        public void testNewFPAllFrequent()
        {
            setEscenario3();
            FPNode raiz = prueba.Raiz;

            Assert.AreEqual(raiz.hijos.Count, 3);
            FPNode prim = raiz.hijos["a"];
            FPNode sec  = raiz.hijos["c"];
            FPNode ter  = raiz.hijos["b"];

            Assert.AreEqual(prim.Padre, raiz);
            Assert.AreEqual(sec.Padre, raiz);
            Assert.AreEqual(ter.Padre, raiz);
            Assert.AreEqual(sec.Ocurrencia, 4);
            Assert.AreEqual(prim.Ocurrencia, 1);
            Assert.AreEqual(ter.Ocurrencia, 1);

            Assert.AreEqual(prim.hijos.Count, 1);
            FPNode prim2 = prim.hijos["d"];

            Assert.AreEqual(prim2.Ocurrencia, 1);
            Assert.AreEqual(prim2.Padre, prim);

            Assert.AreEqual(sec.hijos.Count, 3);
            FPNode sec1 = sec.hijos["d"];
            FPNode sec2 = sec.hijos["a"];
            FPNode sec3 = sec.hijos["e"];

            Assert.AreEqual(sec1.Ocurrencia, 1);
            Assert.AreEqual(sec2.Ocurrencia, 2);
            Assert.AreEqual(sec3.Ocurrencia, 1);
            Assert.AreEqual(sec1.Padre, sec);
            Assert.AreEqual(sec2.Padre, sec);
            Assert.AreEqual(sec3.Padre, sec);

            Assert.AreEqual(ter.hijos.Count, 1);
            FPNode ter1 = ter.hijos["f"];

            Assert.AreEqual(ter1.Ocurrencia, 1);
            Assert.AreEqual(ter1.Padre, ter);

            Assert.AreEqual(prim2.hijos.Count, 0);
            Assert.AreEqual(sec1.hijos.Count, 0);
            Assert.AreEqual(sec3.hijos.Count, 0);
            Assert.AreEqual(ter1.hijos.Count, 0);

            Assert.AreEqual(sec2.hijos.Count, 2);
            FPNode sec21 = sec2.hijos["d"];
            FPNode sec22 = sec2.hijos["b"];

            Assert.AreEqual(sec21.Ocurrencia, 1);
            Assert.AreEqual(sec21.Padre, sec2);
            Assert.AreEqual(sec22.Ocurrencia, 1);
            Assert.AreEqual(sec22.Padre, sec2);

            Assert.AreEqual(sec21.hijos.Count, 0);
            Assert.AreEqual(sec22.hijos.Count, 0);

            Dictionary <string, FPNode> listaEn = prueba.primeroListaEnlazada;
            FPNode A1 = listaEn["a"];

            Assert.AreEqual(A1, sec2);
            FPNode A2 = A1.Siguiente;

            Assert.AreEqual(A2, prim);
            Assert.IsNull(A2.Siguiente);

            FPNode B1 = listaEn["b"];

            Assert.AreEqual(B1, sec22);
            FPNode B2 = B1.Siguiente;

            Assert.AreEqual(B2, ter);
            FPNode B3 = B2.Siguiente;

            Assert.IsNull(B3);

            FPNode C1 = listaEn["c"];

            Assert.AreEqual(C1, sec);
            Assert.IsNull(C1.Siguiente);

            FPNode D1 = listaEn["d"];

            Assert.AreEqual(D1, sec21);
            FPNode D2 = D1.Siguiente;

            Assert.AreEqual(D2, prim2);
            FPNode D3 = D2.Siguiente;

            Assert.AreEqual(D3, sec1);
            Assert.IsNull(D3.Siguiente);

            FPNode E1 = listaEn["e"];

            Assert.AreEqual(E1, sec3);
            FPNode E2 = E1.Siguiente;

            Assert.IsNull(E2);

            FPNode F1 = listaEn["f"];

            Assert.AreEqual(F1, ter1);
            FPNode F2 = F1.Siguiente;

            Assert.IsNull(E2);
        }
        public void testNewFPDict()
        {
            setEscenario2();
            FPNode raiz = prueba.Raiz;

            Assert.AreEqual(raiz.hijos.Count, 2);
            FPNode prim = raiz.hijos["a"];
            FPNode sec  = raiz.hijos["c"];

            Assert.AreEqual(prim.Padre, raiz);
            Assert.AreEqual(sec.Padre, raiz);
            Assert.AreEqual(sec.Ocurrencia, 4);
            Assert.AreEqual(prim.Ocurrencia, 1);

            Assert.AreEqual(prim.hijos.Count, 1);
            FPNode prim2 = prim.hijos["d"];

            Assert.AreEqual(prim2.Ocurrencia, 1);
            Assert.AreEqual(prim2.Padre, prim);

            Assert.AreEqual(sec.hijos.Count, 2);
            FPNode sec1 = sec.hijos["d"];
            FPNode sec2 = sec.hijos["a"];

            Assert.AreEqual(sec1.Ocurrencia, 1);
            Assert.AreEqual(sec2.Ocurrencia, 2);
            Assert.AreEqual(sec1.Padre, sec);
            Assert.AreEqual(sec2.Padre, sec);

            Assert.AreEqual(prim2.hijos.Count, 0);
            Assert.AreEqual(sec1.hijos.Count, 0);

            Assert.AreEqual(sec2.hijos.Count, 1);
            FPNode sec21 = sec2.hijos["d"];

            Assert.AreEqual(sec21.Ocurrencia, 1);
            Assert.AreEqual(sec21.Padre, sec2);

            Assert.AreEqual(sec21.hijos.Count, 0);

            Dictionary <string, FPNode> listaEn = prueba.primeroListaEnlazada;
            FPNode A1 = listaEn["a"];

            Assert.AreEqual(A1, sec2);
            FPNode A2 = A1.Siguiente;

            Assert.AreEqual(A2, prim);
            Assert.IsNull(A2.Siguiente);

            FPNode C1 = listaEn["c"];

            Assert.AreEqual(C1, sec);
            Assert.IsNull(C1.Siguiente);

            FPNode D1 = listaEn["d"];

            Assert.AreEqual(D1, sec21);
            FPNode D2 = D1.Siguiente;

            Assert.AreEqual(D2, prim2);
            FPNode D3 = D2.Siguiente;

            Assert.AreEqual(D3, sec1);
            Assert.IsNull(D3.Siguiente);
        }