private List <IEmergingPattern> FilterPatterns(List <Instance> instances, List <List <IEmergingPattern> > patternClusterList) { var confidenceByPattern = new Dictionary <IEmergingPattern, double>(instances.Count); for (int i = 0; i < ClusterCount; i++) { foreach (var pattern in patternClusterList[i]) { confidenceByPattern.Add(pattern, pattern.Counts[i] / pattern.Counts.Sum()); } } EmergingPatternComparer epComparer = new EmergingPatternComparer(new ItemComparer()); var selectedPatterns = new List <IEmergingPattern>(); for (int i = 0; i < ClusterCount; i++) { patternClusterList[i].Sort( (ep1, ep2) => confidenceByPattern[ep1] > confidenceByPattern[ep2] ? -1 : confidenceByPattern[ep1] < confidenceByPattern[ep2] ? 1 : ep1.Counts[i] > ep2.Counts[i] ? -1 : ep1.Counts[i] < ep2.Counts[i] ? 1 : ep1.Items.Count <ep2.Items.Count ? -1 : ep1.Items.Count> ep2.Items.Count ? 1 : 0); var currentSelectedPatterns = new List <IEmergingPattern>(); for (int j = 0; j < patternClusterList[i].Count; j++) { var candidatePattern = patternClusterList[i][j]; bool generalPatternFound = false; for (int k = 0; k < currentSelectedPatterns.Count && generalPatternFound == false; k++) { var patternRelation = epComparer.Compare(candidatePattern, currentSelectedPatterns[k]); if (patternRelation == SubsetRelation.Subset || patternRelation == SubsetRelation.Equal) { generalPatternFound = true; } } if (!generalPatternFound) { currentSelectedPatterns.Add(patternClusterList[i][j]); selectedPatterns.Add(patternClusterList[i][j]); } } } return(selectedPatterns); }
public IEnumerable <IEmergingPattern> Mine(InstanceModel model, IEnumerable <Instance> instances, Feature classFeature) { EmergingPatternCreator EpCreator = new EmergingPatternCreator(); EmergingPatternComparer epComparer = new EmergingPatternComparer(new ItemComparer()); IEmergingPatternSimplifier simplifier = new EmergingPatternSimplifier(new ItemComparer()); FilteredCollection <IEmergingPattern> minimal = new FilteredCollection <IEmergingPattern>(epComparer.Compare, FilterRelation); if (MinePatternsWhileBuildingTree) { DecisionTreeBuilder.OnSplitEvaluation = delegate(IDecisionTreeNode node, ISplitIterator iterator, List <SelectorContext> currentContext) { IChildSelector currentSelector = null; for (int i = 0; i < iterator.CurrentDistribution.Length; i++) { double[] distribution = iterator.CurrentDistribution[i]; if (EPTester.Test(distribution, model, classFeature)) { if (currentSelector == null) { currentSelector = iterator.CreateCurrentChildSelector(); } EmergingPattern ep = EpCreator.ExtractPattern(currentContext, model, classFeature, currentSelector, i); ep.Counts = (double[])distribution.Clone(); minimal.Add(simplifier.Simplify(ep)); } } }; DoMine(model, instances, classFeature, EpCreator, null); } else { DoMine(model, instances, classFeature, EpCreator, p => { if (EPTester.Test(p.Counts, model, classFeature)) { minimal.Add(simplifier.Simplify(p)); } } ); } return(minimal.GetItems()); }