Пример #1
0
        public double GetHeadC45Scale(TrainingSet set)
        {
            TrainingSet ordered = DoOrderC45(set);

            double maxC45scale = 0.0d;

            for (int i = 0; i < ordered.Samples.Count; i++)
            {
                int    c45   = ordered.Samples[i].C45;
                double scale = GetC45EarningScale(ordered, c45);

                if (i == 0)
                {
                    maxC45scale = scale;
                }

                if (maxC45scale < scale)
                {
                    maxC45scale = scale;
                }
            }

            return(maxC45scale);
        }
Пример #2
0
        static void Main(string[] args)
        {
            TrainingEntry entry1 = new TrainingEntry("AGE", null);
            TrainingEntry entry2 = new TrainingEntry("MODEL", new string[] { "X3", "X5" });
            TrainingEntry entry3 = new TrainingEntry("GENDER", new string[] { "MALE", "FEMALE" });

            TrainingSet set = new TrainingSet("SATISFIED", entry1, entry2, entry3);

            set.AddSample(new TrainingSample(false, 21, "X5", "MALE"));
            set.AddSample(new TrainingSample(true, 19, "X3", "FEMALE"));
            set.AddSample(new TrainingSample(false, 22, "X5", "MALE"));
            set.AddSample(new TrainingSample(true, 21, "X3", "MALE"));
            set.AddSample(new TrainingSample(true, 30, "X3", "MALE"));
            set.AddSample(new TrainingSample(false, 60, "X3", "FEMALE"));
            set.AddSample(new TrainingSample(false, 45, "X3", "FEMALE"));
            set.AddSample(new TrainingSample(false, 55, "X3", "MALE"));
            set.Lock();

            Trainer trainer = new Trainer(set);

            trainer.TrainID3(set);

            Console.ReadKey();
        }
Пример #3
0
 public TrainingSet(TrainingSet other, List <TrainingSample> samples)
 {
     this.OutputName = other.OutputName;
     this.Entries    = other.Entries;
     this.Samples    = samples;
 }
Пример #4
0
 public TrainingSet(TrainingSet other)
 {
     this.OutputName = other.OutputName;
     this.Entries    = other.Entries;
     this.Samples    = other.Samples;
 }
Пример #5
0
        public bool CalculateResult(TrainingSet set, string attibrute)
        {
            int index         = GetEntryIDFor(set, attibrute);
            int totalEntries  = set.Entries.Length;
            int totalOutCount = set.Entries[index].Values.Length;

            string[] entryValues = set.Entries[index].Values;
            string   name        = set.Entries[index].Name;
            double   scale       = this.GetBranchEarningScale(set, index);

            Dictionary <string, int> outCountsTrue  = new Dictionary <string, int>(totalOutCount);
            Dictionary <string, int> outCountsFalse = new Dictionary <string, int>(totalOutCount);

            for (int i = 0; i < set.Samples.Count; i++)
            {
                string currentSample = set.Samples[i].Samples[index];

                bool including = entryValues.Any(s => s.Equals(currentSample, StringComparison.InvariantCultureIgnoreCase));

                if (including)
                {
                    if (set.Samples[i].Output)
                    {
                        if (!outCountsTrue.ContainsKey(currentSample))
                        {
                            outCountsTrue.Add(currentSample, 1);
                        }
                        else
                        {
                            outCountsTrue[currentSample]++;
                        }
                    }
                    else
                    {
                        if (!outCountsFalse.ContainsKey(currentSample))
                        {
                            outCountsFalse.Add(currentSample, 1);
                        }
                        else
                        {
                            outCountsFalse[currentSample]++;
                        }
                    }
                }
            }


            //Console.WriteLine("================================");
            //Console.WriteLine($"NAME = {name}, SCALE = {scale}");
            //Console.WriteLine("TRUE : " + outCountsTrue.Count);
            //Console.WriteLine("FALSE : " + outCountsFalse.Count);
            //if (outCountsTrue.ContainsKey(attibrute)) {
            //    Console.WriteLine("TRUE COUNT : " + outCountsTrue[attibrute]);
            //}
            //if (outCountsFalse.ContainsKey(attibrute)) {
            //    Console.WriteLine("FALSE COUNT : " + outCountsFalse[attibrute]);
            //}
            //Console.WriteLine("================================");

            if (!outCountsTrue.ContainsKey(attibrute) && outCountsFalse.ContainsKey(attibrute))
            {
                return(false);
            }
            else if (outCountsTrue.ContainsKey(attibrute) && !outCountsFalse.ContainsKey(attibrute))
            {
                return(true);
            }



            return(false);
        }
Пример #6
0
 public double CalculateH(TrainingSet set)
 {
     return(this.CalculateH(set.GetP1(), set.GetP2()));
 }
Пример #7
0
        public void TrainID3(TrainingSet set)
        {
            string master = this.CalculateHead(set);

            Console.WriteLine("HEAD NODE = " + master);
            Console.WriteLine();

            StringBuilder sb = new StringBuilder(1000);

            for (int i = 0; i < set.Entries.Length; i++)
            {
                TrainingEntry current = set.Entries[i];

                if (i == 0)
                {
                    sb.AppendLine(GetHeadC45Name(set) + " <= " + GetHeadC45(set));
                }

                if (current.Name.Equals(master, StringComparison.InvariantCultureIgnoreCase))
                {
                    for (int j = 0; j < current.Values.Length; j++)
                    {
                        string currentName = current.Values[j];

                        TrainingSet currentExcept  = this.GetExceptBranch(set, currentName);
                        TrainingSet currentExcept2 = GetExceptLowerBranch(currentExcept, GetHeadC45(set));

                        string subBranch = CalculateHead(currentExcept2);
                        string subName   = currentName;

                        sb.AppendLine("--------- SUB NODE = " + subBranch);
                        sb.AppendLine("\t\t VALUE = " + subName);



                        if (!subBranch.Equals(master))
                        {
                            sb.AppendLine("|");
                            sb.AppendLine("|");
                            sb.AppendLine("--------- SUB NODE = " + currentName);

                            PrintSubBranch(currentExcept2, sb, subBranch);

                            sb.AppendLine("|");
                            sb.AppendLine("|");
                        }
                        else
                        {
                            sb.AppendLine("\t\t(" + CalculateResult(currentExcept2, subName) + ")");
                        }
                        //Console.WriteLine("name = " + currentName + "\t\t sub = " + subName + " -- scale = " + currentScale);
                    }
                }

                if (i == 0)
                {
                    sb.AppendLine(GetHeadC45Name(set) + " > " + GetHeadC45(set));
                }
                if (i == 0)
                {
                    sb.AppendLine("(False)");
                }
            }
            Console.WriteLine(sb.ToString());
        }
Пример #8
0
        public double GetBranchEarningScale(TrainingSet set, int index)
        {
            int totalEntries = set.Entries.Length;

            //int totalOutCount = set.Entries[index].Values.Length;

            string[] entryValues = set.Entries[index].Values;

            if (entryValues == null && index == 0)
            {
                entryValues = set.Entries[1].Values;
            }

            //ISI soğuk, ılık, sıcak --- 4, 6, 4
            Dictionary <string, int> outCountsTrue  = new Dictionary <string, int>();
            Dictionary <string, int> outCountsFalse = new Dictionary <string, int>();

            for (int i = 0; i < set.Samples.Count; i++)
            {
                string currentSample = set.Samples[i].Samples[index];

                if (set.Samples[i].Output)
                {
                    if (!outCountsTrue.ContainsKey(currentSample))
                    {
                        outCountsTrue.Add(currentSample, 1);
                    }
                    else
                    {
                        outCountsTrue[currentSample]++;
                    }
                }
                else
                {
                    if (!outCountsFalse.ContainsKey(currentSample))
                    {
                        outCountsFalse.Add(currentSample, 1);
                    }
                    else
                    {
                        outCountsFalse[currentSample]++;
                    }
                }
            }

            double totalH = 0.0d;

            //Yüksek olanı al ?

            if (outCountsTrue.Count > 0 && outCountsFalse.Count == 0)
            {
                return(1.0d);
            }
            else if (outCountsTrue.Count == 0 && outCountsFalse.Count > 0)
            {
                return(0.0d);
            }

            foreach (KeyValuePair <string, int> kvp in outCountsTrue)
            {
                int countTrue  = 0;
                int countFalse = 0;

                if (outCountsTrue.ContainsKey(kvp.Key))
                {
                    countTrue = outCountsTrue[kvp.Key];
                }

                if (outCountsFalse.ContainsKey(kvp.Key))
                {
                    countFalse = outCountsFalse[kvp.Key];
                }

                int countTotal = countTrue + countFalse;


                double currentH = 0.0d;

                if (countTrue == 0 && countFalse > 0)
                {
                    currentH = this.CalculateH(countFalse / (double)countTotal, countFalse / (double)countTotal);
                }
                else if (countTrue > 0 && countFalse > 0)
                {
                    currentH = this.CalculateH(countTrue / (double)countTotal, countFalse / (double)countTotal);
                }
                else if (countTrue > 0 && countFalse == 0)
                {
                    currentH = this.CalculateH(countTrue / (double)countTotal, countTrue / (double)countTotal);
                }

                totalH += (double)((double)((double)countTotal / (double)set.GetDataCount()) * currentH);

                //Console.WriteLine("Key = {0}, Value = {1}, TRUE = {2}, FALSE = {3}, H = {4}", kvp.Key, kvp.Value, countTrue, countFalse, currentH);
            }

            return(this.CalculateH(set) - totalH);
        }
Пример #9
0
 public Trainer(TrainingSet set)
 {
     this.m_set     = set;
     this.m_results = new List <EntryResult>();
 }