示例#1
0
 public List <Tuple <Instance, double> >[] CreateChildrenInstances(IEnumerable <Tuple <Instance, double> > instances,
                                                                   IChildSelector selector, double threshold = 0)
 {
     List <Tuple <Instance, double> >[] result = new List <Tuple <Instance, double> > [selector.ChildrenCount];
     for (int i = 0; i < selector.ChildrenCount; i++)
     {
         result[i] = new List <Tuple <Instance, double> >();
     }
     foreach (var tuple in instances)
     {
         double[] selection = selector.Select(tuple.Item1);
         if (selection != null)
         {
             for (int i = 0; i < selection.Length; i++)
             {
                 if (selection[i] > 0)
                 {
                     double newMembership = selection[i] * tuple.Item2;
                     if (newMembership >= threshold)
                     {
                         result[i].Add(Tuple.Create(tuple.Item1, newMembership));
                     }
                 }
             }
         }
     }
     return(result);
 }
示例#2
0
            public override Item GetItem(IChildSelector generalSelector, int index)
            {
                CutPointSelector selector = (CutPointSelector)generalSelector;

                if (index == 0)
                {
                    return new LessOrEqualThanItem
                           {
                               Feature = selector.Feature,
                               Value   = selector.CutPoint
                           }
                }
                ;
                else if (index == 1)
                {
                    return new GreatherThanItem
                           {
                               Feature = selector.Feature,
                               Value   = selector.CutPoint
                           }
                }
                ;
                else
                {
                    throw new InvalidOperationException("Invalid index value for CutPointSelector");
                }
            }
示例#3
0
            public override Item GetItem(IChildSelector generalSelector, int index)
            {
                MultivariateCutPointSelector selector = (MultivariateCutPointSelector)generalSelector;

                if (index == 0)
                {
                    return new MultivariateLessOrEqualThanItem(selector.Weights)
                           {
                               Features     = selector.Features,
                               Value        = selector.CutPoint,
                               FeaturesHash = ((IStructuralEquatable)selector.Features).GetHashCode(EqualityComparer <Feature> .Default),
                           }
                }
                ;
                else if (index == 1)
                {
                    return new MultivariateGreatherThanItem(selector.Weights)
                           {
                               Features     = selector.Features,
                               Value        = selector.CutPoint,
                               FeaturesHash = ((IStructuralEquatable)selector.Features).GetHashCode(EqualityComparer <Feature> .Default),
                           }
                }
                ;
                else
                {
                    throw new InvalidOperationException("Invalid index value for CutPointSelector");
                }
            }
示例#4
0
            public override Item GetItem(IChildSelector generalSelector, int index)
            {
                ValueAndComplementSelector selector = (ValueAndComplementSelector)generalSelector;

                if (index == 0)
                {
                    return new EqualThanItem()
                           {
                               Feature = selector.Feature,
                               Value   = selector.Value
                           }
                }
                ;
                else if (index == 1)
                {
                    return new DifferentThanItem()
                           {
                               Feature = selector.Feature,
                               Value   = selector.Value
                           }
                }
                ;
                else
                {
                    throw new InvalidOperationException("Invalid index value for ValueAndComplementSelector");
                }
            }
示例#5
0
        public IEnumerable <IEmergingPattern> Mine(InstanceModel model, IEnumerable <Instance> instances, Feature classFeature)
        {
            EmergingPatternCreator     EpCreator = new EmergingPatternCreator();
            IEmergingPatternSimplifier simplifier;

            if (Multivariate)
            {
                simplifier = new EmergingPatternSimplifier(new MultivariateItemComparer());
            }
            else
            {
                simplifier = new EmergingPatternSimplifier(new ItemComparer());
            }

            List <IEmergingPattern> patternsList = new List <IEmergingPattern>();

            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();
                            patternsList.Add(simplifier.Simplify(ep));
                        }
                    }
                };
                DoMine(model, instances, classFeature, EpCreator, null);
            }
            else
            {
                DoMine(model, instances, classFeature, EpCreator, p =>
                {
                    if (EPTester.Test(p.Counts, model, classFeature))
                    {
                        patternsList.Add(simplifier.Simplify(p));
                    }
                }
                       );
            }
            return(patternsList);
        }
示例#6
0
 public EmergingPattern ExtractPattern(List <SelectorContext> currentContext, InstanceModel model,
                                       Feature classFeature, IChildSelector selector, int index)
 {
     return
         (Create(
              currentContext.Union(new List <SelectorContext>
     {
         new SelectorContext
         {
             Selector = selector,
             Index = index
         }
     }), model, classFeature));
 }
示例#7
0
            public override Item GetItem(IChildSelector generalSelector, int index)
            {
                MultipleValuesSelector selector = (MultipleValuesSelector)generalSelector;

                if (index < 0 || index >= selector.Values.Length)
                {
                    throw new InvalidOperationException("Invalid index value for MultipleValuesSelector");
                }
                return(new EqualThanItem
                {
                    Feature = selector.Feature,
                    Value = selector.Values[index]
                });
            }
示例#8
0
        public EmergingPattern Create(IEnumerable <SelectorContext> contexes, InstanceModel model, Feature classFeature)
        {
            EmergingPattern result = new EmergingPattern(model, classFeature, 0);

            foreach (SelectorContext context in contexes)
            {
                IChildSelector childSelector = context.Selector;
                ItemBuilder    builder;
                if (!builderForType.TryGetValue(childSelector.GetType(), out builder))
                {
                    throw new InvalidOperationException(string.Format("Unknown selector: '{0}'", childSelector.GetType().Name));
                }
                Item item = builder.GetItem(childSelector, context.Index);
                item.Model = model;
                result.Items.Add(item);
            }
            return(result);
        }
示例#9
0
 public bool EvaluateThis(double currentGain, ISplitIterator splitIterator, int level)
 {
     if (list.Count < _whichBetterToFind || currentGain > minStoredValue)
     {
         IChildSelector currentChildSelector = splitIterator.CreateCurrentChildSelector();
         if (CanAcceptChildSelector(currentChildSelector, level))
         {
             list.Add(Tuple.Create(currentGain, currentChildSelector,
                                   splitIterator.CurrentDistribution.CloneArray()));
             list.Sort(comparer);
             if (list.Count > _whichBetterToFind)
             {
                 list.RemoveAt(_whichBetterToFind);
             }
             int index = Math.Min(_whichBetterToFind - 1, list.Count - 1);
             minStoredValue = list[index].Item1;
             return(true);
         }
     }
     return(false);
 }
示例#10
0
        private void FillNode(ref Dictionary <IDecisionTreeNode, double> validityIndexByNode, InstanceModel model, ref Dictionary <IDecisionTreeNode, IEnumerable <Tuple <Instance, double> > > instancesByNode,
                              Feature classFeature, ref Dictionary <IDecisionTreeNode, int> levelByNode, List <SelectorContext> currentContext, ref int leafCount)
        {
            IDecisionTreeNode node           = null;
            double            bestIndexValue = Double.MinValue;

            foreach (var currentNode in validityIndexByNode.Keys)
            {
                if (bestIndexValue < validityIndexByNode[currentNode])
                {
                    bestIndexValue = validityIndexByNode[currentNode];
                    node           = currentNode;
                }
            }

            if (node != null)
            {
                int level     = levelByNode[node];
                var instances = instancesByNode[node];

                int whichBetterToFind = 1;
                if (OnSelectingWhichBetterSplit != null)
                {
                    whichBetterToFind = OnSelectingWhichBetterSplit(node, level);
                }
                WiningSplitSelector winingSplitSelector = new WiningSplitSelector(whichBetterToFind)
                {
                    CanAcceptChildSelector = this.CanAcceptChildSelector,
                };
                foreach (var feature in OnSelectingFeaturesToConsider(model.Features, level))
                {
                    if (feature != classFeature)
                    {
                        ISplitIterator splitIterator = SplitIteratorProvider.GetSplitIterator(model, feature, classFeature);
                        if (splitIterator == null)
                        {
                            throw new InvalidOperationException(string.Format("Undefined iterator for feature {0}",
                                                                              feature));
                        }
                        splitIterator.Initialize(feature, instances);
                        while (splitIterator.FindNext())
                        {
                            double currentGain = DistributionEvaluator.Evaluate(node.Data,
                                                                                splitIterator.CurrentDistribution);
                            if (currentGain > MinimalSplitGain || leafCount < ClusterCount)
                            {
                                if (OnSplitEvaluation != null)
                                {
                                    OnSplitEvaluation(node, splitIterator, currentContext);
                                }
                                winingSplitSelector.EvaluateThis(currentGain, splitIterator, level);
                            }
                        }
                    }
                }

                if (winingSplitSelector.IsWinner())
                {
                    IChildSelector maxSelector = winingSplitSelector.WinningSelector;
                    node.ChildSelector = maxSelector;
                    node.Children      = new IDecisionTreeNode[maxSelector.ChildrenCount];
                    var instancesPerChildNode =
                        childrenInstanceCreator.CreateChildrenInstances(instances, maxSelector, double.MinValue);

                    for (int i = 0; i < maxSelector.ChildrenCount; i++)
                    {
                        var childNode = new DecisionTreeNode {
                            Parent = node
                        };
                        node.Children[i] = childNode;
                        childNode.Data   = winingSplitSelector.WinningDistribution[i];
                        SelectorContext context = null;
                        if (OnSplitEvaluation != null)
                        {
                            context = new SelectorContext
                            {
                                Index    = i,
                                Selector = node.ChildSelector,
                            };
                            currentContext.Add(context);
                        }

                        double currentBestValidityIndex = double.MinValue;
                        foreach (var feature in OnSelectingFeaturesToConsider(model.Features, level))
                        {
                            if (feature != classFeature)
                            {
                                ISplitIterator splitIterator = SplitIteratorProvider.GetSplitIterator(model, feature, classFeature);
                                if (splitIterator == null)
                                {
                                    throw new InvalidOperationException(string.Format("Undefined iterator for feature {0}",
                                                                                      feature));
                                }
                                splitIterator.Initialize(feature, instancesPerChildNode[i]);
                                while (splitIterator.FindNext())
                                {
                                    double currentGain = DistributionEvaluator.Evaluate(node.Data,
                                                                                        splitIterator.CurrentDistribution);
                                    if (currentGain > currentBestValidityIndex)
                                    {
                                        if (OnSplitEvaluation != null)
                                        {
                                            OnSplitEvaluation(node, splitIterator, currentContext);
                                        }

                                        currentBestValidityIndex = currentGain;
                                    }
                                }
                            }
                        }

                        if (currentBestValidityIndex > validityIndexByNode[node] || leafCount < ClusterCount)
                        {
                            validityIndexByNode.Add(childNode, currentBestValidityIndex);
                            instancesByNode.Add(childNode, instancesPerChildNode[i]);
                            levelByNode.Add(childNode, level + 1);
                        }

                        if (OnSplitEvaluation != null)
                        {
                            currentContext.Remove(context);
                        }
                    }

                    validityIndexByNode.Remove(node);
                    instancesByNode.Remove(node);
                    levelByNode.Remove(node);
                    leafCount++;

                    if (leafCount < 4 * ClusterCount)
                    {
                        FillNode(ref validityIndexByNode, model, ref instancesByNode, classFeature, ref levelByNode, currentContext, ref leafCount);
                    }
                }
            }
        }
示例#11
0
 public abstract Item GetItem(IChildSelector generalSelector, int index);
 public DecisionTreeNode(double[] data, IChildSelector selector = null, params IDecisionTreeNode[] children)
 {
     Data          = data;
     ChildSelector = selector;
     Children      = children;
 }