private Patient.Classification PerfectMatch() { //getting index of selected input patient string input = txtNum.Text; int inputId = Convert.ToInt32(input); int inputIndex = inputList.FindIndex(x => x.ID == inputId); Patient.Classification classification = Patient.Classification.Unknown; for (int data = 0; data < dataList.Count; data++) { if ((dataList[data].GetAllAttributes().Where(entry => inputList[inputIndex].GetAllAttributes()[entry.Key] != entry.Value).ToDictionary(entry => entry.Key, entry => entry.Value)).Count == 0) { perfectMatchLabel.Visibility = Visibility.Visible; perfectMatch.Visibility = Visibility.Visible; if (typeof(Patient.Classification).IsEnumDefined(Convert.ToString(dataList[data].Diagnosis))) { inputList[inputIndex].Diagnosis = (Patient.Classification)Enum.Parse(typeof(Patient.Classification), Convert.ToString(dataList[data].Diagnosis)); } classification = inputList[inputIndex].Diagnosis; } } return(classification); }
private Patient.Classification RecommendedClassiciation(Patient.Classification distanceClassification, Patient.Classification perfectMatch, List <Patient.Classification> weka) { List <Patient.Classification> classifications = new List <Patient.Classification> { weka[0], weka[1], distanceClassification }; if (perfectMatch != Patient.Classification.Unknown) { classifications.Add(perfectMatch); } var frequency = classifications.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()); Patient.Classification recommendation; //If no majority diagnosis, diagnose in order of severity. if (frequency.Values.Distinct().Count() == 1 && frequency.ContainsValue(1)) { if (classifications.Contains(Patient.Classification.Cancer)) { recommendation = Patient.Classification.Cancer; } else if (classifications.Contains(Patient.Classification.Polyp)) { recommendation = Patient.Classification.Polyp; } else if (classifications.Contains(Patient.Classification.Infection)) { recommendation = Patient.Classification.Infection; } else if (classifications.Contains(Patient.Classification.Normal)) { recommendation = Patient.Classification.Normal; } else { recommendation = Patient.Classification.Unknown; } } else { //finds majority diagnosis recommendation = (from item in classifications group item by item into g orderby g.Count() descending select g.Key).First(); } return(recommendation); }
private void UpdateUI(Patient.Classification distanceClassification, Patient.Classification perfectMatchClassification, Patient.Classification j48Classification, Patient.Classification nngeClassification, Patient.Classification recommendation, Patient.Classification givenClassification) { DistanceResult.Content = distanceClassification; j48Result.Content = j48Classification; NNgeResult.Content = nngeClassification; RecommendedDiagnosis.Content = recommendation; perfectMatch.Content = perfectMatchClassification; if (givenClassification != Patient.Classification.Unknown) { givenDiagnosis.Content = givenClassification; } }
public void SetClassification(string in_classification) { if (in_classification == "Cancer") { classification = Patient.Classification.Cancer; } else if (in_classification == "Polyp") { classification = Patient.Classification.Polyp; } else if (in_classification == "Normal") { classification = Patient.Classification.Normal; } else if (in_classification == "Infection") { classification = Patient.Classification.Infection; } }
private Patient.Classification RecommendedClassification(Patient.Classification distanceClassification, Patient.Classification perfectMatch, List <Patient.Classification> weka) { List <Patient.Classification> classifications = new List <Patient.Classification> { weka[0], weka[1], distanceClassification }; if (perfectMatch != Patient.Classification.Unknown) { classifications.Add(perfectMatch); } Patient.Classification recommendation = MostFrequentClass(classifications); inputList[int.Parse(txtNum.Text) - 1].Diagnosis = recommendation; return(recommendation); }
private void GenerateButton_Click(object sender, RoutedEventArgs e) { ClearUI(); classificationDistances.Clear(); Patient.Classification distanceClassification = WeightedEuclidClassify(); Patient.Classification perfectMatchClassification = PerfectMatch(); List <Patient.Classification> wekaClassifications = WekaClassify(); Patient.Classification recommendation = RecommendedClassiciation(distanceClassification, perfectMatchClassification, wekaClassifications); Patient.Classification givenClassification = Patient.Classification.Unknown; if (inputList[int.Parse(txtNum.Text) - 1].GivenDiagnosis != Patient.Classification.Unknown) { givenClassification = inputList[int.Parse(txtNum.Text) - 1].GivenDiagnosis; givenDiagnosisLabel.Visibility = Visibility.Visible; givenDiagnosis.Visibility = Visibility.Visible; } UpdateUI(distanceClassification, perfectMatchClassification, wekaClassifications[0], wekaClassifications[1], recommendation, givenClassification); }
private Patient.Classification WeightedEuclidClassify() { List <Patient> cancerData = dataList.Where(C => C.Diagnosis == Patient.Classification.Cancer).ToList(); List <Patient> infectionData = dataList.Where(C => C.Diagnosis == Patient.Classification.Infection).ToList(); List <Patient> polypData = dataList.Where(C => C.Diagnosis == Patient.Classification.Polyp).ToList(); List <Patient> normalData = dataList.Where(C => C.Diagnosis == Patient.Classification.Normal).ToList(); List <List <Patient> > completeData = new List <List <Patient> > { cancerData, infectionData, polypData, normalData }; double diff = 0; double euclid = 0; double weightedEuclid = 0; //getting index of selected input patient int inputId = Convert.ToInt32(txtNum.Text); int inputIndex = inputList.FindIndex(x => x.ID == inputId); foreach (var dataSet in completeData) { List <double> weightedDistances = new List <double>(); List <double> distances = new List <double>(); for (int data = 0; data < dataSet.Count; data++) { weightedEuclid = 0; euclid = 0; for (int attr = 1; attr < rankingList.Count; attr++) { foreach (var item in rankingList) { if (item.GetNumber() == attr) { double weight = item.GetWeight(); double inputVal = inputList[inputIndex].GetSingleAttribute(attr - 1); double dataVal = dataSet[data].GetSingleAttribute(attr - 1); diff = inputVal - dataVal; euclid += Math.Pow(diff, 2); weightedEuclid += weight * Math.Sqrt(Math.Pow(diff, 2)); break; } } } distances.Add(Math.Sqrt(euclid)); weightedDistances.Add(weightedEuclid); } //List<double> weightedDistances_2 = weightedDistances; classificationDistances.Add(dataSet[0].Diagnosis, weightedDistances); } //getting smallest mean distance double minMean = int.MaxValue; Patient.Classification closestAverageClassification = new Patient.Classification(); foreach (var item in classificationDistances) { if (item.Value.Average() < minMean) { closestAverageClassification = item.Key; minMean = item.Value.Average(); } } return(closestAverageClassification); }
private List <Patient.Classification> WekaClassify() { //getting index of selected input patient int inputId = Convert.ToInt32(txtNum.Text); int inputIndex = inputList.FindIndex(x => x.ID == inputId); Patient selectedPatient = inputList[inputIndex]; Patient.Classification j48Classification = Patient.Classification.Unknown; Patient.Classification nngeClassification = Patient.Classification.Unknown; //iterating through models for (int modeli = 0; modeli < wekaModels.Count; modeli++) { //iterating through model rules for (int rulei = 0; rulei < wekaModels[modeli].Rules.Count; rulei++) { bool match = false; //iterating through ruleitems for (int ruleItemi = 0; ruleItemi < wekaModels[modeli].Rules[rulei].RuleItems.Count; ruleItemi++) { RuleItem ruleItem = wekaModels[modeli].Rules[rulei].RuleItems[ruleItemi]; int attributeIndex = patientFeatures.IndexOf(ruleItem.Feature) - 1; double patientValue = selectedPatient.GetSingleAttribute(attributeIndex); List <double> ruleVals = ruleItem.GetValues(); List <RuleItem.Operators> ruleOps = ruleItem.GetOps(); for (int i = 0; i < ruleVals.Count; i++) { if (ruleOps[i] == RuleItem.Operators.Equal) { if (patientValue == ruleVals[i]) { match = true; } else { match = false; break; } } else if (ruleOps[i] == RuleItem.Operators.Less) { if (patientValue < ruleVals[i]) { match = true; } else { match = false; break; } } else if (ruleOps[i] == RuleItem.Operators.Greater) { if (patientValue > ruleVals[i]) { match = true; } else { match = false; break; } } else if (ruleOps[i] == RuleItem.Operators.LessOrEqual) { if (patientValue <= ruleVals[i]) { match = true; } else { match = false; break; } } else if (ruleOps[i] == RuleItem.Operators.GreatorOrEqual) { if (patientValue >= ruleVals[i]) { match = true; } else { match = false; break; } } } if (!match) { break; } } if (match) { if (modeli == 0) { j48Classification = wekaModels[modeli].Rules[rulei].Classification; } else { nngeClassification = wekaModels[modeli].Rules[rulei].Classification; } break; } } } return(new List <Patient.Classification> { j48Classification, nngeClassification }); }