Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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
            });
        }