/// <summary> /// Возвращает достоверность правила. /// </summary> /// <param name="X">Элевент из левой части правила.</param> /// <param name="XY">Комбинация Х с элементов из правой части правила.</param> /// <param name="allFrequentItems"></param> /// <returns></returns> private double GetConfidence(string[] X, string[] XY, ItemsDictionary allFrequentItems) { double supportX = FindItemByProducts(X, allFrequentItems).Support; double supportXY = FindItemByProducts(XY, allFrequentItems).Support; return(supportXY / supportX); }
/// <summary> /// Генерация ассоциативных правил. /// </summary> /// <param name="allFrequentItems">Все наиболее встречающиеся элементы.</param> /// <returns></returns> private HashSet <Rule> GenerateRules(ItemsDictionary allFrequentItems) { var rulesList = new HashSet <Rule>(); foreach (var item in allFrequentItems) { if (item.ProductSet.Length > 1) { IEnumerable <string[]> subsetsList = GenerateSubsets(item.ProductSet); foreach (var subset in subsetsList) { string[] remaining = GetRemaining(subset, item.ProductSet); Rule rule = new Rule(subset, remaining, 0); if (!rulesList.Contains(rule)) { rulesList.Add(rule); } } } } return(rulesList); }
/// <summary> /// Запускает процесс поиска ассоциативных правил. /// </summary> /// <param name="minSupport">Минимальная поддержка (определяется частотностью вхождения элемента).</param> /// <param name="minConfidence">Минимальная надёжность (определяется тем, как часто правило срабатывает).</param> /// <param name="items">Список предметов.</param> /// <param name="transactions">Список транзакций.</param> /// <returns></returns> public Output processTransaction(double minSupport, double minConfidence, IEnumerable <string> items, ApriorySet[] transactions) { IList <Item> frequentItems = GetL1FrequentItems(minSupport, items, transactions); ItemsDictionary allFrequentItems = new ItemsDictionary(); allFrequentItems.ConcatItems(frequentItems); IDictionary <string[], double> candidates = new Dictionary <string[], double>(); double transactionsCount = transactions.Length; do { candidates = GenerateCandidates(frequentItems, transactions); frequentItems = GetFrequentItems(candidates, minSupport, transactions.Length); allFrequentItems.ConcatItems(frequentItems); } while (candidates.Count != 0); HashSet <Rule> rules = GenerateRules(allFrequentItems); IList <Rule> strongRules = GetStrongRules(minConfidence, rules, allFrequentItems); return(new Output { StrongRules = strongRules, FrequentItems = allFrequentItems }); }
public static string printFrequentItems(ItemsDictionary items) { string result = ""; foreach (Item item in items) { result += printProductSet(item.ProductSet) + "\n"; } return(result); }
/// <summary> /// Добавление нового правила, удовлетворяющего условию минимальной достоверности. /// </summary> /// <param name="rule">Правило.</param> /// <param name="XY">Правая часть правила (результирующий набор)</param> /// <param name="strongRules">Список правил, удовлетворяющих минимальной достоверности.</param> /// <param name="minConfidence">Минимальная достоверность.</param> /// <param name="allFrequentItems">Все частовстречающиеся элементы.</param> private void AddStrongRule(Rule rule, string[] XY, List <Rule> strongRules, double minConfidence, ItemsDictionary allFrequentItems) { double confidence = GetConfidence(rule.X, XY, allFrequentItems); if (confidence >= minConfidence) { Rule newRule = new Rule(rule.X, rule.Y, confidence); strongRules.Add(newRule); } confidence = GetConfidence(rule.Y, XY, allFrequentItems); if (confidence >= minConfidence) { Rule newRule = new Rule(rule.Y, rule.X, confidence); strongRules.Add(newRule); } }
/// <summary> /// Получение ассоциативных правил, удовлетворяющих условие минимальной достоверности. /// </summary> /// <param name="minConfidence">Минимальная достоверность.</param> /// <param name="rules">Хэш с правилами.</param> /// <param name="allFrequentItems">Все частовстречающиеся элементы.</param> /// <returns></returns> private IList <Rule> GetStrongRules(double minConfidence, HashSet <Rule> rules, ItemsDictionary allFrequentItems) { var strongRules = new List <Rule>(); foreach (Rule rule in rules) { string[] xy = new string[rule.X.Length + rule.Y.Length]; xy = rule.X.Concat(rule.Y).ToArray(); AddStrongRule(rule, xy, strongRules, minConfidence, allFrequentItems); } //strongRules.Sort(); return(strongRules); }