Beispiel #1
0
    public static void Main(String[] args)
    {
        //multiple ways to construct a BigFloat
        BigFloat bigfloat1 = new BigFloat(1234567);
        BigFloat bigfloat2 = new BigFloat("1234567");
        BigFloat bigfloat3 = new BigFloat(1234567.0);
        BigFloat bigfloat4 = BigFloat.Parse("1234567.123");


        Console.WriteLine("(1234567 * 12)^2 - 15 = \n");


        Console.WriteLine("Arithmetic:             " + (Math.Pow(1234567 * 12, 2) - 15));

        //non-static methods
        Console.WriteLine("BigFloat w/ non-static: " + bigfloat1.Multiply(12).Pow(2).Subtract(15));

        //static methods
        bigfloat2 = BigFloat.Multiply(bigfloat2, 12);
        bigfloat2 = BigFloat.Pow(bigfloat2, 2);
        bigfloat2 = BigFloat.Subtract(bigfloat2, new BigInteger(15));
        Console.WriteLine("BigFloat w/ static    : " + bigfloat2);

        //operators
        Console.WriteLine("BigFloat w/ operators : " + (((bigfloat3 * 12) ^ 2) - 15));


        Console.WriteLine();

        //additional methods
        Console.WriteLine("Round(1234567.1234)     = " + BigFloat.Round(bigfloat4));
        Console.WriteLine("Ceil(1234567.1234)      = " + BigFloat.Ceil(bigfloat4));
        Console.WriteLine("Floor(1234567.1234)     = " + BigFloat.Floor(bigfloat4));
        Console.WriteLine("Inverse(1234567.1234)   = " + BigFloat.Inverse(bigfloat4).ToString(20));
        Console.WriteLine("Sqrt(1234567.1234)      = " + BigFloat.Sqrt(bigfloat4));
        Console.WriteLine("log10(1234567.1234)     = " + BigFloat.Log10(bigfloat4));

        //large numbers
        BigFloat pi = new BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949");

        Console.WriteLine("\nPi to a really long decimal place:");
        Console.WriteLine(pi.ToString(200));

        Console.WriteLine("\nTau (2*PI): ");
        Console.WriteLine((pi * 2).ToString(200));


        Console.Read();
    }
        public Dictionary <string, BigFloat> GetClassScores(int i, bool passZeroProbs)
        {
            // Github Link: https://github.com/Osinko/BigFloat
            // This method uses BigFloat library for high precision probability calculations
            // When multiplication of probability values is performed consecutively, the value gets smaller and smaller
            List <string> uniqueClasses = trainFeatures[columns.Count - 1].Distinct().ToList();// Gets unique classes
            string        classColumn   = columns.Keys.Last();
            Dictionary <string, BigFloat> classScores = new Dictionary <string, BigFloat>();
            BigFloat numerator;
            BigFloat denominator     = new BigFloat(0);
            bool     denominatorFlag = false;
            double   eps             = 0.00001;// if passZeroProbs is selected, use this value as a probability value

            // CPT's consist of (part1|part2, prob_value) like strings. Each part has (rule$value) like elements. (rule$value) equals to (rule=value)
            // Example CPT element: (credit_history$all paid|own_telephone$none, class$bad)
            foreach (string uqClass in uniqueClasses)// Calculates probability values for each class
            {
                string queryP1;
                string part1, part2;
                // Creates query according to bayes formula;
                // P(class=x|test_sample)=(P(test_sample|class=x)P(class=x))/P(test_sample)
                numerator = new BigFloat(1);
                foreach (string str in columns.Keys)
                {
                    if (str == classColumn)// P(class=x) part
                    {
                        part1 = String.Format("{0}${1}", str, uqClass);
                        part2 = "";
                    }
                    else // P(test_sample|class=x) part
                    {    // Creates query from test data infos like '(part1|part2_element1,part2_element2)'
                        part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]);
                        part2 = "";
                        string[] part2Split = bayesNetStructure[str].Split(',');
                        string   splitter   = "";
                        for (int j = 0; j < part2Split.Length; j++)
                        {
                            if (part2Split[j] == classColumn)
                            {
                                part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqClass);
                            }
                            else
                            {
                                part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]);
                            }
                            splitter = ",";
                        }
                    }
                    queryP1 = part1 + part2;
                    double prob = CPT[str][queryP1];// Gets query's probability values from CPT
                    if (prob == 0 && passZeroProbs)
                    {
                        prob = eps;
                    }
                    numerator = numerator.Multiply(new BigFloat(prob));
                }

                if (!denominatorFlag)// P(test_sample) part
                {
                    denominatorFlag = true;
                    denominator     = new BigFloat(0);
                    foreach (string uqInnerClass in uniqueClasses)// Same calculation process with numerator, one difference is this loop calculates each possibilities for classes
                    {
                        BigFloat tempDenominator = new BigFloat(1);
                        foreach (string str in columns.Keys)
                        {
                            if (str == classColumn)// P(class=x) part
                            {
                                part1 = String.Format("{0}${1}", str, uqInnerClass);
                                part2 = "";
                            }
                            else // P(test_sample|class=x) part
                            {    // Creates query from test data infos like '(part1|part2_element1,part2_element2)'
                                part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]);
                                part2 = "";
                                string[] part2Split = bayesNetStructure[str].Split(',');
                                string   splitter   = "";
                                for (int j = 0; j < part2Split.Length; j++)
                                {
                                    if (part2Split[j] == classColumn)
                                    {
                                        part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqInnerClass);
                                    }
                                    else
                                    {
                                        part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]);
                                    }
                                    splitter = ",";
                                }
                            }
                            queryP1 = part1 + part2;
                            double prob = CPT[str][queryP1];// Gets query's probability values from CPT
                            if (prob == 0 && passZeroProbs)
                            {
                                prob = eps;
                            }
                            tempDenominator = tempDenominator.Multiply(new BigFloat(prob));
                        }
                        denominator = denominator.Add(tempDenominator);
                    }
                }

                if (denominator == 0)
                {
                    classScores[uqClass] = 0;
                }
                else
                {
                    classScores[uqClass] = numerator.Divide(denominator);
                }
            }

            return(classScores);
        }
Beispiel #3
0
 protected override BigFloat Multiply(BigFloat multiplicand, BigFloat multiplier)
 {
     return(multiplicand.Multiply(multiplier));
 }