コード例 #1
0
        public static bool isSampleOk(RichTextBox attrBox, SampleColection samplesColection, out string error)
        {
            if (attrBox.Text == "")
            {
                error = "You must enter a sample\n";
                return(false);
            }
            var text = attrBox.Text.Trim().Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < text.Length; i++)
            {
                text[i] = Data.convertDoubleFormat(text[i].Trim());
                double result;
                bool   parsed = double.TryParse(text[i], out result);
                if (!parsed)
                {
                    error = "Wrong sample format\n";
                    return(false);
                }
            }
            int fileSamplesLength = samplesColection.samples.First().attributes.Count;

            if (text.Length != fileSamplesLength)
            {
                error = "There must be the same amount of attributes in attributes filed like in samples in file";
                return(false);
            }
            error = "Ok";
            return(true);
        }
コード例 #2
0
 public DataValidation(SampleColection sampleColection, DataLoader dataLoader, ComboBox comboBox, RichTextBox kBox, RichTextBox attrBox)
 {
     if (!isDataLoaded(dataLoader, out string dataError))
     {
         message += dataError;
         return;
     }
     if (!isSampleColectionLoaded(sampleColection, out string sampleColectionError))
     {
         message += sampleColectionError;
         return;
     }
     if (!isSampleOk(attrBox, sampleColection, out string sampleError))
     {
         message += sampleError;
         return;
     }
     if (!isCorrectK(kBox, sampleColection, out string kError))
     {
         message += kError;
         return;
     }
     if (!isMetricChosen(comboBox, out string metricError))
     {
         message += metricError;
         return;
     }
     isValid = true;
 }
コード例 #3
0
 public static bool isSampleColectionLoaded(SampleColection sampleColection, out string error)
 {
     if (sampleColection == null)
     {
         error = "You must load correct file first";
         return(false);
     }
     error = "Ok";
     return(true);
 }
コード例 #4
0
        public SampleColection copy()
        {
            SampleColection newSampleColection = new SampleColection(new Data(new string[] { }).dataFromFile);

            foreach (Sample sample in samples)
            {
                newSampleColection.addSample(sample.copy());
            }
            return(newSampleColection);
        }
コード例 #5
0
        public static SampleColection normalizeSampleColection(SampleColection sampleColection)
        {
            SampleColection normalizedSampleColection = new SampleColection(new Data(new string[] { }).dataFromFile);

            foreach (Sample sample in sampleColection.samples)
            {
                var normalizedSample = new Sample(normalizeAttributes(sampleColection, sample.attributes), sample.decision);
                normalizedSampleColection.samples.Add(normalizedSample);
            }
            return(normalizedSampleColection);
        }
コード例 #6
0
        public static Dictionary <int, double> minAttributes(SampleColection sampleColection, int numberOfAttr)
        {
            var    minAttributes = new Dictionary <int, double>();
            double min;

            for (int i = 0; i < numberOfAttr; i++)
            {
                min = findMinAttr(sampleColection, i);
                minAttributes.Add(i, min);
            }
            return(minAttributes);
        }
コード例 #7
0
        public static Dictionary <int, double> maxAttributes(SampleColection sampleColection, int numberOfAttr)
        {
            var    maxAttributes = new Dictionary <int, double>();
            double max;

            for (int i = 0; i < numberOfAttr; i++)
            {
                max = findMaxAttr(sampleColection, i);
                maxAttributes.Add(i, max);
            }
            return(maxAttributes);
        }
コード例 #8
0
        public static double findMinAttr(SampleColection sampleColection, int attrNumber)
        {
            double min = sampleColection.samples[0].attributes[attrNumber];

            foreach (Sample sample in sampleColection.samples)
            {
                if (sample.attributes[attrNumber] < min)
                {
                    min = sample.attributes[attrNumber];
                }
            }
            return(min);
        }
コード例 #9
0
        public static double findMaxAttr(SampleColection sampleColection, int attrNumber)
        {
            double max = sampleColection.samples[0].attributes[attrNumber];

            foreach (Sample sample in sampleColection.samples)
            {
                if (sample.attributes[attrNumber] > max)
                {
                    max = sample.attributes[attrNumber];
                }
            }
            return(max);
        }
コード例 #10
0
        public static int maxK(SampleColection sampleColection)
        {
            var segregatedSamples = sampleColection.segregateSamplesByDecision();
            int minAmount         = segregatedSamples.First().Value.Count;

            foreach (var item in segregatedSamples)
            {
                if (item.Value.Count < minAmount)
                {
                    minAmount = item.Value.Count;
                }
            }
            return(minAmount);
        }
コード例 #11
0
        public static List <double> normalizeAttributes(SampleColection sampleColection, List <double> attributes)
        {
            List <double> normalizedAttributes = new List <double>();
            var           minDict = new Dictionary <int, double>();
            var           maxDict = new Dictionary <int, double>();

            minDict = minAttributes(sampleColection, attributes.Count);
            maxDict = maxAttributes(sampleColection, attributes.Count);
            for (int i = 0; i < attributes.Count; i++)
            {
                normalizedAttributes.Add(normalizeAttribute(attributes[i], minDict[i], maxDict[i]));
            }
            return(normalizedAttributes);
        }
コード例 #12
0
        public static bool isCorrectK(RichTextBox kBox, SampleColection sampleColection, out string error)
        {
            int  maxK = KChecker.maxK(sampleColection);
            int  result;
            bool parsed = int.TryParse(kBox.Text, out result);

            if (!parsed)
            {
                error = "K must be an integer\n";
                return(false);
            }
            if (result < 1 || result > maxK)
            {
                error = "K must be an integer between 1 and " + maxK + "\n";
                return(false);
            }
            error = "Ok";
            return(true);
        }
コード例 #13
0
        public static double precision(SampleColection sampleColection, int k, Metrics.metric choosedMetric, int p)
        {
            SampleColection newSampleColection = sampleColection.copy();
            int             probes             = 0;
            int             correct            = 0;
            var             samples            = newSampleColection.samples;
            Sample          tmp;

            for (int i = 0; i < samples.Count; i++)
            {
                probes++;
                tmp = newSampleColection.samples.First();
                newSampleColection.removeSample(tmp);
                int?result = Algorithm.chooseDecision(tmp.attributes, newSampleColection, k, choosedMetric, p);
                if (result == tmp.decision)
                {
                    correct++;
                }
                newSampleColection.addSample(tmp);
            }
            return((double)correct / probes * 100);
        }
コード例 #14
0
        private void loadData_Click(object sender, EventArgs e)
        {
            dataLoader = new DataLoader(ofd);
            if (!DataValidation.isDataLoaded(dataLoader, out string dataError))
            {
                dataInfo.Text = dataError;
                return;
            }
            sampleColection = new SampleColection(dataLoader.data);
            var samplesAmount    = sampleColection.countSamples();
            var decisionAmount   = sampleColection.possibleDecisions().Count;
            var attributesAmount = sampleColection.samples.First().attributes.Count;
            var maxK             = KChecker.maxK(sampleColection);

            dataInfo.Text        = "File OK\n";
            dataInfo.Text       += "Loaded " + samplesAmount + " samples\n";
            dataInfo.Text       += "There are " + decisionAmount + " decisions possible\n";
            dataInfo.Visible     = true;
            attributesInfo.Text  = "Attributes";
            attributesInfo.Text += "\nEnter " + attributesAmount + " attributes";
            kInfo.Text           = "K";
            kInfo.Text          += "\nK must be between 1 and " + maxK;
        }
コード例 #15
0
        public static int?chooseDecision(List <double> attributesToCheck, SampleColection sampleColection, int k, Metrics.metric choosedMetric, int p)
        {
            var normalizedAttributes      = Normalization.normalizeAttributes(sampleColection, attributesToCheck);
            var normalizedSampleColection = Normalization.normalizeSampleColection(sampleColection);
            var minDistances = new Dictionary <int, double>();

            minDistances = countSumOfKminDistances(normalizedAttributes, normalizedSampleColection, k, choosedMetric, p);
            double min      = minDistances.First().Value;
            int    decision = minDistances.First().Key;

            foreach (var item in minDistances)
            {
                if (item.Value < min)
                {
                    min      = item.Value;
                    decision = item.Key;
                }
            }
            if (isOnlyOneMin(minDistances, min))
            {
                return(decision);
            }
            return(null);
        }
コード例 #16
0
        static Dictionary <int, double> countSumOfKminDistances(List <double> sampleToCheck, SampleColection data, int k, Metrics.metric choosedMetric, int p)
        {
            var distances = new Dictionary <int, List <double> >();

            distances = countDistances(sampleToCheck, data, choosedMetric, p);
            double sumOfKminDistances = 0;
            var    minDistances       = new Dictionary <int, double>();

            foreach (var item in distances)
            {
                item.Value.Sort();
                for (int i = 0; i < k; i++)
                {
                    sumOfKminDistances += item.Value[i];
                }
                minDistances.Add(item.Key, sumOfKminDistances);
                sumOfKminDistances = 0;
            }
            return(minDistances);
        }
コード例 #17
0
        static Dictionary <int, List <double> > countDistances(List <double> sampleToCheck, SampleColection data, Metrics.metric choosedMetric, int p)
        {
            var    distances = new Dictionary <int, List <double> >();
            double distance;

            foreach (Sample sample in data.samples)
            {
                distance = choosedMetric(sampleToCheck, sample.attributes, p);
                if (!distances.ContainsKey(sample.decision))
                {
                    distances.Add(sample.decision, new List <double> {
                        distance
                    });
                }
                else
                {
                    distances[sample.decision].Add(distance);
                }
            }
            return(distances);
        }