private void GetOccurencesList(int position)
        {
            var uniques = GetUniqueValues(position);

            foreach (var unique in uniques)
            {
                var rows = GetRowNumbersForOccurences(unique);
                LastRowOccurences.Add(new Occurence(unique, DecisionRows.Count(array => array[position] == unique), rows));
            }
            ShowLastDigitsAndOccurences();
            ShowDecisionsCountMessage();
        }
        public List <DecisionColumn> CalculateDecisions()
        {
            DecisionColumns = new List <DecisionColumn>();
            for (int i = 0; i < DecisionRows.First().Length - 1; i++)
            {
                var decisionColumn = new DecisionColumn();
                var uniqueValues   = DecisionRows.Select(value => value[i]).Distinct().ToList();
                foreach (var uniqueValue in uniqueValues)
                {
                    var decisionAttributeOccurence = new DecisionAttributeOccurence(uniqueValue);
                    for (int j = 0; j < DecisionRows.Count; j++)
                    {
                        if (DecisionRows[j][i] == uniqueValue)
                        {
                            var lastColumnDecision = LastRowOccurences.Where(occurence => occurence.RowNumbers.Contains(j + 1)).Select(occurence => occurence.Decision).First();
                            if (lastColumnDecision == DecisionType.Positive)
                            {
                                decisionAttributeOccurence.PositiveRowNumbers.Add(j + 1);
                            }
                            else
                            {
                                decisionAttributeOccurence.NegativeRowNumbers.Add(j + 1);
                            }
                        }
                    }
                    decisionColumn.Attributes.Add(decisionAttributeOccurence);
                }
                DecisionColumns.Add(decisionColumn);
            }
            CalculateColumnsEntropies();
            CalculateColumnInformationGain();
            var rejectedList = DecisionColumns.Where(column => AlreadyUsedIndexes.Contains((int)column.ColumnIndex));
            var bestOne      = DecisionColumns.Except(rejectedList).MaxBy(column => column.InformationGain); //Nieużyta z największym przyrostem informacji

            var indexes = new List <int> {
                (int)bestOne.ColumnIndex
            };

            DoUnknownThing(indexes, null);

            return(DecisionColumns);
        }
        private double CalculateTotalEntropy()
        {
            var decisions = LastRowOccurences.Sum(occurence => occurence.Amount);

            return(LastRowOccurences.Sum(occurence => (double)occurence.Amount / decisions * occurence.Entropy));
        }