public bool checkFood() { bool check = true; List <Meal> positive = new DisplayDiet().GetMeals().ToList(); foreach (var i in positive) { if (i.decision.Equals("positive")) { check = true; } else { check = false; } } return(check); }
public List <Meal> ID3(dynamic food, List <User> users) { //dtable(); // Dictionary<string,List<Category>> FoodCategory = new Dictionary<string,List<Category>>(); List <Meal> category = new List <Meal> { }; foreach (User u in users) { BMI = u.bmi; User = u.user; } //Iterate through food and add each food with range of macronutrients to category list foreach (var nw in food) { var value = (nw.Category.Predicted).Split(","); category.Add(new Meal { food = nw.Food.Food, protein = value[0], carb = value[1], fat = value[2], calorie = value[3], fiber = value[4], nprotein = nw.Food.Total_Protein, ncarb = nw.Food.Total_Carb, nfat = nw.Food.Total_Fat, ncalorie = nw.Food.Num_Calorie, nfiber = nw.Food.Fiber, serving = nw.Food.Serving, img = nw.Food.img, fgroup = nw.Food.fgroup, PrefID = nw.Food.ID, servingQty = nw.Food.ServingQty.ToString(), decision = "" }); } var csv = new CsvReader(File.OpenText(path)); var myCustomObjects = csv.GetRecords <MealData>(); DataTable dt = new DataTable("FoodDBSample"); DataRow row; dt.Columns.Add("Category", "Carb", "Protein", "Fat", "Calorie", "Fiber", "Decision"); foreach (var record in myCustomObjects) { row = dt.NewRow(); row["Category"] = record.Category; row["Carb"] = record.Carb; row["Protein"] = record.Protein; row["Fat"] = record.Fat; row["Calorie"] = record.Calorie; row["Fiber"] = record.Fiber; row["Decision"] = record.Outcome; dt.Rows.Add(row); } var codebook = new Codification(dt); DataTable symbols = codebook.Apply(dt); int[][] inputs = symbols.ToJagged <int>("Category", "Carb", "Protein", "Fat", "Calorie", "Fiber"); int[] outputs = symbols.ToArray <int>("Decision"); //specify which columns to use for making decisions var id3learning = new ID3Learning() { new DecisionVariable("Category", 4), new DecisionVariable("Carb", 2), new DecisionVariable("Protein", 2), new DecisionVariable("Fat", 2), new DecisionVariable("Calorie", 2), new DecisionVariable("Fiber", 2) }; // Learn the training instances! DecisionTree tree = id3learning.Learn(inputs, outputs); // Compute the training error when predicting training instances double error = new ZeroOneLoss(outputs).Loss(tree.Decide(inputs)); List <dynamic> predict = new List <dynamic> { }; //iterate through data structure category and make prediction for each food foreach (var item in category) { predict.Add(codebook.Transform(new[, ] { { "Category", $"{BMI}" }, { "Carb", $"{item.carb}" }, { "Protein", $"{item.protein}" }, { "Fat", $"{item.fat}" }, { "Calorie", $"{item.calorie}" }, { "Fiber", $"{item.fiber}" } })); } //Accord.IO.Serializer.Save(tree, Path.Combine(basePath, "ID3TreeModel.bin")); //int predicted = tree.Decide(query); List <string> q = new List <string>(); foreach (var i in predict) { q.Add(codebook.Revert("Decision", tree.Decide(i))); } // We can translate it back to strings using //string answer = codebook.Revert("Decision", predicted); //foreach (var item in q) //{ // System.Diagnostics.Debug.WriteLine(item); //} var foods = category.Zip(q, (n, w) => new { Food = n, Decision = w }); List <Meal> positive = new List <Meal> { }; List <Meal> negative = new List <Meal> { }; foreach (var nw in foods) { nw.Food.decision = nw.Decision; } foreach (var item in foods) { //System.Diagnostics.Debug.WriteLine(item.Food.food + "\n" + item.Food.nprotein + "\n" + item.Food.ncarb + "\n" + item.Food.nfat + "\n" + item.Food.ncalorie + "\n" + item.Food.serving + "\n" + item.Food.img + "\n" + item.Food.fgroup+"\n"+item.Decision); //System.Diagnostics.Debug.WriteLine(item.Food.food+"\n"+item.Decision); if (item.Decision.Equals("positive")) { positive.Add(new Meal { CurrentUser = User, food = item.Food.food, nprotein = item.Food.nprotein, ncarb = item.Food.ncarb, nfat = item.Food.nfat, ncalorie = item.Food.ncalorie, nfiber = item.Food.nfiber, img = item.Food.img, serving = item.Food.serving, fgroup = item.Food.fgroup, PrefID = item.Food.PrefID, servingQty = item.Food.servingQty, decision = item.Decision }); } if (item.Decision.Equals("negative")) { negative.Add(new Meal { CurrentUser = User, food = item.Food.food, nprotein = item.Food.nprotein, ncarb = item.Food.ncarb, nfat = item.Food.nfat, ncalorie = item.Food.ncalorie, nfiber = item.Food.nfiber, img = item.Food.img, serving = item.Food.serving, fgroup = item.Food.fgroup, PrefID = item.Food.PrefID, servingQty = item.Food.servingQty, decision = item.Decision }); } } //foreach (var item in positive) //{ // //System.Diagnostics.Debug.WriteLine(item.food + "\n" + item.nprotein + "\n" + item.ncarb + "\n" + item.nfat + "\n" + item.ncalorie + "\n" + item.serving + "\n" + item.img + "\n" + item.fgroup + "\n" + item.decision); // System.Diagnostics.Debug.WriteLine(item.food + "\n" + "Protein: "+item.nprotein + "\n" + "Carb: " + item.ncarb + "\n" + "Fat: " + item.nfat + "\n" + "Calorie: " + item.ncalorie+"\n"+ "Fiber: "+item.nfiber+"\n"+ "Outcome: " + item.decision); //} //foreach (var item in negative) //{ // //System.Diagnostics.Debug.WriteLine(item.food + "\n" + item.nprotein + "\n" + item.ncarb + "\n" + item.nfat + "\n" + item.ncalorie + "\n" + item.serving + "\n" + item.img + "\n" + item.fgroup + "\n" + item.decision); // System.Diagnostics.Debug.WriteLine(item.food + "\n" + "Protein: " + item.nprotein + "\n" + "Carb: " + item.ncarb + "\n" + "Fat: " + item.nfat + "\n" + "Calorie: " + item.ncalorie + "\n" + "Fiber: " + item.nfiber + "\n" + "Outcome: " + item.decision); //} // Validation purposes only //var cm = GeneralConfusionMatrix.Estimate(tree, inputs, outputs); //double err = cm.Error; //double acc = cm.Accuracy; //double kappa = cm.Kappa; //validation(); //System.Diagnostics.Debug.WriteLine("error: " + err); //System.Diagnostics.Debug.WriteLine("accuracy: " + acc); DisplayDiet diet = new DisplayDiet(); diet.GetFoods(positive); diet.GetUser(users); //diet.CreateDiet(positive); return(positive); }