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); }
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; } }
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); }
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); }