using System.Collections.Generic;
public static double Logtwo(double num)
return - Math.Log(num)/ Math.Log(2);
public static double CalLog(double numOne, double numTwo, int TotalCount)
double result = (-(numOne / TotalCount)) * ((Math.Log(numOne / TotalCount) / Math.Log(2))) - ((numTwo / TotalCount)) * ((Math.Log(numTwo / TotalCount) / Math.Log(2)));
public static double Found(List<string> x, string k)
public void CalEntropy(string CatNameOne, string CatNameTwo, string CatNameThree, List<CatClass> model, string ClassNo, string ClassYes, int CountTotal, string ColName)
DateTime dt = DateTime.Now;
List<CatClass> modelNo = new List<CatClass>();
List<CatClass> modelYes = new List<CatClass>();
List<CatClass> modelOne = new List<CatClass>();
List<CatClass> modelTwo = new List<CatClass>();
List<CatClass> modelThree = new List<CatClass>();
foreach (var items in model)
if (items.PartClass == ClassNo)
modelNo.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
else if (items.PartClass == ClassYes)
modelYes.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
List<string> itemName = new List<string>();
foreach (var item in model)
itemName.Add(item.PartName1);
List<string> itemClass = new List<string>();
foreach (var item in model)
itemClass.Add(item.PartClass);
var cClass = new CatClass();
if (!(CatName1.Contains(c.PartName1)))
CatName1 += c.PartName1 + " Count : " + Found(itemName, c.PartName1) + " ";
if (c.PartName1 == CatNameOne)
modelOne.Add(new CatClass { PartId = c.PartId, PartName1 = c.PartName1, PartClass = c.PartClass });
else if (c.PartName1 == CatNameTwo)
modelTwo.Add(new CatClass { PartId = c.PartId, PartName1 = c.PartName1, PartClass = c.PartClass });
else if (c.PartName1 == CatNameThree)
modelThree.Add(new CatClass { PartId = c.PartId, PartName1 = c.PartName1, PartClass = c.PartClass });
Console.WriteLine("Category Names " + ColName + " : " + CatName1);
Console.WriteLine("////////////////////////////////////////////////////");
if (!(ClassName.Contains(c.PartClass)))
ClassName += c.PartClass + " Count : " + Found(itemClass, c.PartClass) + " ";
Console.WriteLine("Class Names : " + ClassName);
Console.WriteLine("////////////////////////////////////////////////////");
totalEntropy = CalLog(modelYes.Count(), modelNo.Count(), CountTotal);
Console.WriteLine("Entropy Total : -" + (modelYes.Count() + "/" + CountTotal) + " Log(" + (modelYes.Count() + "/" + CountTotal) + ")-" + (modelNo.Count() + "/" + CountTotal) + " Log(" + (modelNo.Count() + "/" + CountTotal) + ") = " + totalEntropy);
Console.WriteLine("////////////////////////////////////////////////////");
List<CatClass> CountNoCatOne = new List<CatClass>();
List<CatClass> CountYesCatOne = new List<CatClass>();
foreach (var item in modelOne)
Console.WriteLine("CatOne " + ColName + " : " + item.PartId + " " + item.PartName1 + " " + item.PartClass);
foreach (var items in modelOne)
if (items.PartClass == ClassNo)
CountNoCatOne.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
else if (items.PartClass == ClassYes)
CountYesCatOne.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
Console.WriteLine("Count of CatOne " + ColName + " : " + modelOne.Count() + " Numbers and Count of No is : " + CountNoCatOne.Count() + " Numbers and Count of Yes is : " + CountYesCatOne.Count());
float FracOfTotalOne = modelOne.Count();
FracOfTotalOne /= CountTotal;
double totalOne = (FracOfTotalOne * CalLog(CountYesCatOne.Count(), CountNoCatOne.Count(), modelOne.Count()));
Console.WriteLine("Entropy " + modelOne.First().PartName1 + " is : (" + modelOne.Count() + "/" + CountTotal + ") * (-" + (CountYesCatOne.Count() + "/" + modelOne.Count()) + " Log(" + (CountYesCatOne.Count() + "/" + modelOne.Count()) + ")-" + (CountNoCatOne.Count() + "/" + modelOne.Count()) + " Log(" + (CountNoCatOne.Count() + "/" + modelOne.Count()) + ")) = " + totalOne);
Console.WriteLine("////////////////////////////////////////////////////");
List<CatClass> CountNoCatTwo = new List<CatClass>();
List<CatClass> CountYesCatTwo = new List<CatClass>();
foreach (var item in modelTwo)
Console.WriteLine("CatTwo " + ColName + " : " + item.PartId + " " + item.PartName1 + " " + item.PartClass);
foreach (var items in modelTwo)
if (items.PartClass == ClassNo)
CountNoCatTwo.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
else if (items.PartClass == ClassYes)
CountYesCatTwo.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
float FracOfTotalTwo = modelTwo.Count();
FracOfTotalTwo /= CountTotal;
Console.WriteLine("Count of CatTwo " + ColName + " : " + modelTwo.Count() + " Numbers and Count of No is : " + CountNoCatTwo.Count() + " Numbers and Count of Yes is : " + CountYesCatTwo.Count());
double totalTwo = (FracOfTotalTwo * CalLog(CountYesCatTwo.Count(), CountNoCatTwo.Count(), modelTwo.Count()));
Console.WriteLine("Entropy " + modelTwo.First().PartName1 + " is : (" + modelTwo.Count() + "/" + CountTotal + ") -" + (CountYesCatTwo.Count() + "/" + modelTwo.Count()) + " Log(" + (CountYesCatTwo.Count() + "/" + modelTwo.Count()) + ")-" + (CountNoCatTwo.Count() + "/" + modelTwo.Count()) + " Log(" + (CountNoCatTwo.Count() + "/" + modelTwo.Count()) + ") = " + totalTwo);
Console.WriteLine("////////////////////////////////////////////////////");
List<CatClass> CountNoCatThree = new List<CatClass>();
List<CatClass> CountYesCatThree = new List<CatClass>();
foreach (var item in modelThree)
Console.WriteLine("CatThree " + ColName + " : " + item.PartId + " " + item.PartName1 + " " + item.PartClass);
foreach (var items in modelThree)
if (items.PartClass == ClassNo)
CountNoCatThree.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
else if (items.PartClass == ClassYes)
CountYesCatThree.Add(new CatClass { PartId = items.PartId, PartName1 = items.PartName1, PartClass = items.PartClass });
float FracOfTotalThree = modelThree.Count();
FracOfTotalThree /= CountTotal;
Console.WriteLine("Count of CatThree " + ColName + " : " + modelThree.Count() + " Numbers and Count of No is : " + CountNoCatThree.Count() + " Numbers and Count of Yes is : " + CountYesCatThree.Count());
Console.WriteLine("Entropy " + modelThree.First().PartName1 + " is : (" + modelThree.Count() + "/" + CountTotal + ") -" + (CountYesCatThree.Count() + "/" + modelThree.Count()) + " Log(" + (CountYesCatThree.Count() + "/" + modelThree.Count()) + ")-" + (CountNoCatThree.Count() + "/" + modelThree.Count()) + " Log(" + (CountNoCatThree.Count() + "/" + modelThree.Count()) + ") = " + (FracOfTotalThree * CalLog(CountYesCatThree.Count(), CountNoCatThree.Count(), modelThree.Count())));
Console.WriteLine("////////////////////////////////////////////////////");
double totalThree = ((FracOfTotalOne * CalLog(CountYesCatOne.Count(), CountNoCatOne.Count(), modelOne.Count())) + (FracOfTotalTwo * CalLog(CountYesCatTwo.Count(), CountNoCatTwo.Count(), modelTwo.Count())) + (FracOfTotalThree * CalLog(CountYesCatThree.Count(), CountNoCatThree.Count(), modelThree.Count())));
Console.WriteLine("Total Entropy " + ColName + " is : " + totalThree);
Console.WriteLine("Gain " + ColName + " is : " + (totalEntropy - totalThree));
Console.WriteLine("//////////////////////////// END //" + String.Format("{0:dddd, yyyy, MMMM d HH:mm:ss }", dt) + "// END //////////////////////////////");
Console.WriteLine("Total Entropy " + ColName + " is : " + ((FracOfTotalOne * CalLog(CountYesCatOne.Count(), CountNoCatOne.Count(), modelOne.Count())) + (FracOfTotalTwo * CalLog(CountYesCatTwo.Count(), CountNoCatTwo.Count(), modelTwo.Count())) ));
double totalThree = ((FracOfTotalOne * CalLog(CountYesCatOne.Count(), CountNoCatOne.Count(), modelOne.Count())) + (FracOfTotalTwo * CalLog(CountYesCatTwo.Count(), CountNoCatTwo.Count(), modelTwo.Count())) + (FracOfTotalThree * CalLog(CountYesCatThree.Count(), CountNoCatThree.Count(), modelThree.Count())));
Console.WriteLine("Gain " + ColName + " is : " + (totalEntropy - totalThree)); Console.WriteLine("//////////////////////////// END //" + String.Format("{0:dddd, yyyy, MMMM d HH:mm:ss }", dt) + "// END //////////////////////////////");
Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
public static void Main(string[] args)
List<CatClass> model = new List<CatClass>();
List<CatClass> model2 = new List<CatClass>();
List<CatClass> model3 = new List<CatClass>();
model.Add(new CatClass { PartId = 1, PartName1 = "Old", PartName2 = "Medium", PartName3 = "Student", PartClass = "No" });
model.Add(new CatClass { PartId = 2, PartName1 = "Middle", PartName2 = "High", PartName3 = "Teacher", PartClass = "No" });
model.Add(new CatClass { PartId = 3, PartName1 = "Old", PartName2 = "Low", PartName3 = "Teacher", PartClass = "No" });
model.Add(new CatClass { PartId = 4, PartName1 = "Young", PartName2 = "Medium", PartName3 = "Teacher", PartClass = "Yes" });
model.Add(new CatClass { PartId = 5, PartName1 = "Young", PartName2 = "Low", PartName3 = "Teacher", PartClass = "Yes" });
model.Add(new CatClass { PartId = 6, PartName1 = "Old", PartName2 = "Medium", PartName3 = "Student", PartClass = "Yes" });
model.Add(new CatClass { PartId = 7, PartName1 = "Middle", PartName2 = "Medium", PartName3 = "Student", PartClass = "Yes" });
model.Add(new CatClass { PartId = 8, PartName1 = "Young", PartName2 = "High", PartName3 = "Teacher", PartClass = "No" });
model.Add(new CatClass { PartId = 9, PartName1 = "Old", PartName2 = "High", PartName3 = "Student", PartClass = "No" });
model.Add(new CatClass { PartId = 10, PartName1 = "Middle", PartName2 = "High", PartName3 = "Student", PartClass = "No" });
foreach (var item in model)
model2.Add(new CatClass { PartId = item.PartId, PartName1 = item.PartName2, PartClass = item.PartClass });
foreach (var item in model)
model3.Add(new CatClass { PartId = item.PartId, PartName1 = item.PartName3, PartClass = item.PartClass });
DateTime dt = DateTime.Now;
Console.Clear(); Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////////////////////////");
Console.WriteLine("//////////////////////////// Start //" + String.Format("{0:dddd, yyyy, MMMM d HH:mm:ss }", dt) + "// Start //////////////////////////////"); ;
CountTotal = model.Count();
foreach (var item in model)
Console.WriteLine(item.PartId + " " + item.PartName1 + " " + item.PartName2 + " " + item.PartName3 + " " + item.PartClass);
Console.WriteLine("////////////////////////////////////////////////////");
Console.WriteLine("Count of Records : " + CountTotal);
Console.WriteLine("////////////////////////////////////////////////////");
var CalEnt = new MainClass();
CalEnt.CalEntropy("Old", "Middle", "Young", model, ClassNo, ClassYes, CountTotal, "Column 1");
Console.WriteLine("********************************************************************************************************");
CalEnt.CalEntropy("High", "Medium", "Low", model2, ClassNo, ClassYes, CountTotal, "Column 2");
Console.WriteLine("********************************************************************************************************");
CalEnt.CalEntropy("Teacher", "Student", "0", model3, ClassNo, ClassYes, CountTotal, "Column 3");
public int PartId { get; set; }
public string PartName1 { get; set; }
public string PartName2 { get; set; }
public string PartName3 { get; set; }
public string PartClass { get; set; }
public override string ToString()
return "ID: " + PartId + " Name1 : " + PartName1 + " Name2 : " + PartName2 + " Name3 : " + PartName3 + " Class : " + PartClass;
public override bool Equals(object obj)
if (obj == null) return false;
CatClass objAsPart = obj as CatClass;
if (objAsPart == null) return false;
else return Equals(objAsPart);
public override int GetHashCode()
public bool Equals(CatClass other)
if (other == null) return false;
return (this.PartId.Equals(other.PartId));