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); }
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(); }
public TrainingSet(TrainingSet other, List <TrainingSample> samples) { this.OutputName = other.OutputName; this.Entries = other.Entries; this.Samples = samples; }
public TrainingSet(TrainingSet other) { this.OutputName = other.OutputName; this.Entries = other.Entries; this.Samples = other.Samples; }
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); }
public double CalculateH(TrainingSet set) { return(this.CalculateH(set.GetP1(), set.GetP2())); }
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()); }
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); }
public Trainer(TrainingSet set) { this.m_set = set; this.m_results = new List <EntryResult>(); }