Esempio n. 1
0
        public void ChiSquareDistribution()
        {
            int B = 8;
            Random rng = new Random(0);
            //BinomialDistribution d = new BinomialDistribution(0.25, 6);
            //DiscreteUniformDistribution d = new DiscreteUniformDistribution(0, 4);
            //BernoulliDistribution d = new BernoulliDistribution(0.25);
            DiscreteDistribution d = new PoissonDistribution(2.0);

            Sample s = new Sample();
            ChiSquaredDistribution nullDistribution = null;
            for (int i = 0; i < 512; i++) {

                Histogram h = new Histogram(B);
                for (int j = 0; j < 1024; j++) {
                    int k = d.GetRandomValue(rng);
                    h.Add(k);
                    //if (k < h.Count) h[k].Increment();
                    //h[d.GetRandomValue(rng)].Increment();
                }
                TestResult cr = h.ChiSquaredTest(d);
                nullDistribution = (ChiSquaredDistribution) cr.Distribution;
                //Console.WriteLine(((ChiSquaredDistribution) cr.Distribution).DegreesOfFreedom);
                s.Add(cr.Statistic);

            }

            Console.WriteLine(nullDistribution.DegreesOfFreedom);
            TestResult kr = s.KuiperTest(nullDistribution);
            Console.WriteLine(kr.LeftProbability);
        }
Esempio n. 2
0
        public void TwoSampleKS2()
        {
            int n = 2 * 3 * 3; int m = 2 * 2 * 3;
            Random rng = new Random(0);
            NormalDistribution d = new NormalDistribution();

            Histogram h = new Histogram((int) AdvancedIntegerMath.LCM(n, m) + 1);

            //int[] h = new int[AdvancedIntegerMath.LCM(n, m) + 1];

            int count = 1000;
            for (int i = 0; i < count; i++) {

                Sample A = new Sample();
                for (int j = 0; j < n; j++) A.Add(d.GetRandomValue(rng));
                Sample B = new Sample();
                for (int j = 0; j < m; j++) B.Add(d.GetRandomValue(rng));

                TestResult r = Sample.KolmogorovSmirnovTest(A, B);
                int k = (int) Math.Round(r.Statistic * AdvancedIntegerMath.LCM(n, m));
                //Console.WriteLine("{0} {1}", r.Statistic, k);
                h[k].Increment();
                //h[k] = h[k] + 1;

            }

            KolmogorovTwoSampleExactDistribution ks = new KolmogorovTwoSampleExactDistribution(n, m);
            double chi2 = 0.0; int dof = 0;
            for (int i = 0; i < h.Count; i++) {
                double ne = ks.ProbabilityMass(i) * count;
                Console.WriteLine("{0} {1} {2}", i, h[i].Counts, ne);
                if (ne > 4) {
                    chi2 += MoreMath.Sqr(h[i].Counts - ne) / ne;
                    dof++;
                }
            }
            Console.WriteLine("chi^2={0} dof={1}", chi2, dof);

            TestResult r2 = h.ChiSquaredTest(ks);
            ChiSquaredDistribution rd = (ChiSquaredDistribution) r2.Distribution;
            Console.WriteLine("chi^2={0} dof={1} P={2}", r2.Statistic, rd.DegreesOfFreedom, r2.RightProbability);
        }
        //Method that calculates the calibration parameters
        void calibrazione(double[] X_kinect, double[] Y_kinect, double[] Z_kinect)
        {
            //Grid coordinates
            double[] X_Ref_B = new double[12] { -517.5, -172.5, 172.5, 517.5, -517.5, -172.5, 172.5, 517.5, -517.5, -172.5, 172.5, 517.5 };// coordinate X dei punti della griglia di riferimento (origine posta al centro della griglia stessa)
            double[] Y_Ref_B = new double[12] { 345.0, 345.0, 345.0, 345.0, 0.0, 0.0, 0.0, 0.0, -345.0, -345.0, -345.0, -345.0 };// coordinate Y dei punti della griglia di riferimento (origine posta al centro della griglia stessa)
            double[] Z_Ref_B = new double[12];

            Sample XKINECT = new Sample(X_kinect);
            Sample YKINECT = new Sample(Y_kinect);
            Sample ZKINECT = new Sample(Z_kinect);

            // barycenter of Kinect coordinates
            double X_Bar = XKINECT.Mean;
            double Y_Bar = YKINECT.Mean;
            double Z_Bar = ZKINECT.Mean;

            //Kinect barycentric coordinates contaneirs
            double[] X_Kinect_Bar = new double[12];
            double[] Y_Kinect_Bar = new double[12];
            double[] Z_Kinect_Bar = new double[12];

            //Kinect barycentric coordinates 
            for (int i = 0; i < 12; i++)
            {
                X_Kinect_Bar[i] = X_kinect[i] - X_Bar;
                Y_Kinect_Bar[i] = Y_kinect[i] - Y_Bar;
                Z_Kinect_Bar[i] = Z_kinect[i] - Z_Bar;
            }

            //Modello rotazione + 2 parametri di scala Yoss=AX+b  oppure B=Yoss-b=AX  X=B*A^-1
           
            RectangularMatrix A = new RectangularMatrix(36, 5); 
            ColumnVector B = new ColumnVector(36);
            ColumnVector bb = new ColumnVector(36);
            ColumnVector Yoss = new ColumnVector(36);
            ColumnVector X = new ColumnVector(5);
            SquareMatrix X1 = new SquareMatrix(5);
            ColumnVector X2 = new ColumnVector(5);

            for (int i = 0; i < 12; i++)
            {
                
                Yoss[3 * i] = X_Ref_B[i];
                Yoss[3 * i + 1] = Y_Ref_B[i];
                Yoss[3 * i + 2] = Z_Ref_B[i];

                
                A[3 * i, 0] = Y_Kinect_Bar[i];
                A[3 * i, 1] = -Z_Kinect_Bar[i];
                A[3 * i, 2] = 0.0;
                A[3 * i, 3] = X_Kinect_Bar[i];
                A[3 * i, 4] = 0.0;

               
                A[3 * i + 1, 0] = -X_Kinect_Bar[i];
                A[3 * i + 1, 1] = 0.0;
                A[3 * i + 1, 2] = Z_Kinect_Bar[i];
                A[3 * i + 1, 3] = 0.0;
                A[3 * i + 1, 4] = Y_Kinect_Bar[i];

                
                A[3 * i + 2, 0] = 0.0;
                A[3 * i + 2, 1] = X_Kinect_Bar[i];
                A[3 * i + 2, 2] = -Y_Kinect_Bar[i];
                A[3 * i + 2, 3] = 0.0;
                A[3 * i + 2, 4] = 0.0;

               
                bb[3 * i] = X_Kinect_Bar[i];
                bb[3 * i + 1] = Y_Kinect_Bar[i];
                bb[3 * i + 2] = Z_Kinect_Bar[i];

                
                B[3 * i] = X_Ref_B[i] - X_Kinect_Bar[i];
                B[3 * i + 1] = Y_Ref_B[i] - Y_Kinect_Bar[i];
                B[3 * i + 2] = Z_Ref_B[i] - Z_Kinect_Bar[i];
            }

            X1 = (SquareMatrix)(A.Transpose() * A);
            X2 = (A.Transpose() * B); 
            X = (X1.Inverse()) * X2;

            a = X[0];
            b = X[1];
            c = X[2];
            lambdaX = X[3];
            lambdaY = X[4];
            this.sw9.Write("{0:#####.0000}      {1:#####.0000}      {2:#####.0000}      {3:#####.0000}      {4:#####.0000}      ", a, b, c, lambdaX, lambdaY);
            this.sw9.WriteLine();
        }
Esempio n. 4
0
        /// <summary>
        /// Meetod kõigi sisendite (ehk eelduste) välja arvutamiseks
        /// </summary>
        /// <param name="finDataAdapter">Adapter kõigi finantsandmete kättesaamise jaoks</param>
        /// <param name="dcfInput">DCF arvutuste eelduste hoidja</param>
        public static void CalculateInput(FinDataAdapter finDataAdapter, DcfInput dcfInput)
        {
            CalculateCorrelation(finDataAdapter, dcfInput);
            int requiredPeriodsForMean = 1;
            List<FinData> finDatas = finDataAdapter.FinDataDao.FinDatas;
            int k = 0;
            Sample sampleRevenue = new Sample();
            Sample sampleTax = new Sample();
            Sample sampleInterest = new Sample();

            Sample sampleTotalAssets = new Sample();
            Sample sampleTotalLiabilities = new Sample();
            Sample sampleTotalCurrentAssets = new Sample();
            Sample sampleTotalCurrentLiabilities = new Sample();
            Sample sampleAllCosts = new Sample();
            Sample sampleEbitda = new Sample();
            Sample sampleDepreciation = new Sample();
            Sample sampleEbit = new Sample();

            for (int i = finDatas.Count - 1; i >= 4; i--)
            {
                if (k < 12)
                {
                    if (k == 0)
                    {
                        try
                        {
                            dcfInput.SharesOutstanding = (double)finDatas[i].BsCommonSharesOutstanding;
                        }
                        catch (InvalidOperationException) { }
                    }
                    try
                    {
                        double RevenueGrowth = (double)(finDatas[i].IsRevenue / finDatas[i - 4].IsRevenue) - 1;
                        sampleRevenue.Add(RevenueGrowth);
                    }
                    catch (InvalidOperationException) { }

                    try
                    {
                        double taxRate = (double)((finDatas[i].IsPretaxIncome - finDatas[i].IsIncomeAfterTax) / finDatas[i].IsPretaxIncome);
                        sampleTax.Add(taxRate);
                    }
                    catch (InvalidOperationException) { }

                    double debt = 0;
                    if (finDatas[i].BsCurrentPortionOfLongTermDebt != null)
                    {
                        debt += (double)finDatas[i].BsCurrentPortionOfLongTermDebt;
                    }
                    if (finDatas[i].BsTotalLongTermDebt != null)
                    {
                        debt += (double)finDatas[i].BsTotalLongTermDebt;
                    }
                    if (finDatas[i].FrInterestExpense != null && debt != 0.0)
                    {
                        double interest = (double)(finDatas[i].FrInterestExpense) / debt;
                        if (interest < 0.2)
                        {
                            sampleInterest.Add(interest);
                        }
                    }

                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalAssets != null)
                    {
                        double temp = (double)(finDatas[i].BsTotalAssets / finDatas[i].IsRevenue);
                        if (temp > 0.5 && temp < 50)
                        {
                            sampleTotalAssets.Add(temp);
                        }
                    }
                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalLiabilities != null)
                    {
                        double temp = (double)(finDatas[i].BsTotalLiabilities / finDatas[i].IsRevenue);
                        if (temp > 0.5 && temp < 50)
                        {
                            sampleTotalLiabilities.Add(temp);
                        }
                    }

                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalCurrentAssets != null)
                    {
                        double temp = (double)(finDatas[i].BsTotalCurrentAssets / finDatas[i].IsRevenue);
                        if (temp > 0.5 && temp < 50)
                        {
                            sampleTotalCurrentAssets.Add(temp);
                        }
                    }
                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalCurrentLiabilities != null)
                    {
                        double temp = (double)(finDatas[i].BsTotalCurrentLiabilities / finDatas[i].IsRevenue);
                        if (temp > 0.5 && temp < 50)
                        {
                            sampleTotalCurrentLiabilities.Add(temp);
                        }
                    }

                    double allCosts = 0.0;
                    if (finDatas[i].IsTotalOperatingExpenses != null)
                    {
                        allCosts += (double)finDatas[i].IsTotalOperatingExpenses;
                    }
                    if (finDatas[i].IsDepreciationAmortization != null)
                    {
                        allCosts -= (double)finDatas[i].IsDepreciationAmortization;
                    }
                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && allCosts != 0.0)
                    {
                        double temp = (double)(allCosts / finDatas[i].IsRevenue);
                        if (temp > 0.1 && temp < 1)
                        {
                            sampleAllCosts.Add(temp);
                        }
                    }

                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].FrEbitda != null)
                    {
                        double temp = (double)(finDatas[i].FrEbitda / finDatas[i].IsRevenue);
                        if (temp > -1.0 && temp < 1.0)
                        {
                            sampleEbitda.Add(temp);
                        }
                    }

                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].IsDepreciationAmortization != null)
                    {
                        double temp = (double)(finDatas[i].IsDepreciationAmortization / finDatas[i].IsRevenue);
                        if (temp > -1.0 && temp < 1.0)
                        {
                            sampleDepreciation.Add(temp);
                        }
                    }
                    if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].FrEbit != null)
                    {
                        double temp = (double)(finDatas[i].FrEbit / finDatas[i].IsRevenue);
                        if (temp > -1.0 && temp < 1.0)
                        {
                            sampleEbit.Add(temp);
                        }
                    }

                }

                k++;
            }

            if (sampleRevenue.Count >= requiredPeriodsForMean)
            {
                dcfInput.GrowthRatePrognosis = sampleRevenue.Mean;
            }
            if (sampleTax.Count >= requiredPeriodsForMean)
            {
                dcfInput.TaxRate = sampleTax.Mean;
            }
            if (sampleInterest.Count >= requiredPeriodsForMean)
            {
                dcfInput.CostOfDebt = sampleInterest.Mean;
            }

            if (sampleTotalAssets.Count >= requiredPeriodsForMean)
            {
                dcfInput.TotalAssetsPrcRevenue = sampleTotalAssets.Mean;
            }
            if (sampleTotalLiabilities.Count >= requiredPeriodsForMean)
            {
                dcfInput.TotalLiabilitiesPrcRevenue = sampleTotalLiabilities.Mean;
            }
            if (sampleTotalCurrentAssets.Count >= requiredPeriodsForMean)
            {
                dcfInput.TotalCurrentAssetsPrcRevenue = sampleTotalCurrentAssets.Mean;
            }
            if (sampleTotalCurrentLiabilities.Count >= requiredPeriodsForMean)
            {
                dcfInput.TotalCurrentLiabilitiesPrcRevenue = sampleTotalCurrentLiabilities.Mean;
            }
            if (sampleAllCosts.Count >= requiredPeriodsForMean)
            {
                dcfInput.AllCostsPrcRevenue = sampleAllCosts.Mean;
            }
            if (sampleEbitda.Count >= requiredPeriodsForMean)
            {
                dcfInput.EbitdaPrcRevenue = sampleEbitda.Mean;
            }
            if (sampleDepreciation.Count >= requiredPeriodsForMean)
            {
                dcfInput.DepreciationPrcRevenue = sampleDepreciation.Mean;
            }
            if (sampleEbit.Count >= requiredPeriodsForMean)
            {
                dcfInput.EbitPrcRevenue = sampleEbit.Mean;
            }
        }
        // Method that calculates the calibration parameters
        public void Calibration(double[] X_Kinect, double[] Y_Kinect, double[] Z_Kinect)
        {
            double[] X_Ref_B = new double[dim];
            double[] Y_Ref_B = new double[dim];
            double[] Z_Ref_B = new double[dim];
            
                if (colonne_griglia_calibrazione % 2 == 0 && righe_griglia_calibrazione % 2 == 0)
                {
                    for (int i = 0; i < righe_griglia_calibrazione; i++)
                    {
                        for (int j = 0; j < colonne_griglia_calibrazione; j++)
                        {
                            X_Ref_B[colonne_griglia_calibrazione*i + j] = (-colonne_griglia_calibrazione/2 + j)*step + step/2;
                            Y_Ref_B[colonne_griglia_calibrazione*i + j] = (righe_griglia_calibrazione/2 - i)*step - step/2;
                        }
                    }
                }

                if (colonne_griglia_calibrazione % 2 == 0 && righe_griglia_calibrazione % 2 != 0) 
                {
                    for (int i = 0; i < righe_griglia_calibrazione; i++)
                    {
                        for (int j = 0; j < colonne_griglia_calibrazione; j++)
                        {
                            X_Ref_B[colonne_griglia_calibrazione * i + j] = (-colonne_griglia_calibrazione / 2 + j) * step + step / 2;
                            Y_Ref_B[colonne_griglia_calibrazione * i + j] = ((righe_griglia_calibrazione-1)/ 2 - i) * step; 
                        }
                    }
                }

                if (colonne_griglia_calibrazione % 2 != 0 && righe_griglia_calibrazione % 2 == 0) 
                { 
                    for (int i = 0; i < righe_griglia_calibrazione; i++)
                    {
                        for (int j = 0; j < colonne_griglia_calibrazione; j++)
                        {
                            X_Ref_B[colonne_griglia_calibrazione*i + j] = (-(colonne_griglia_calibrazione-1)/2 + j)*step;
                            Y_Ref_B[colonne_griglia_calibrazione*i + j] = (righe_griglia_calibrazione/2 - i)*step - step/2;
                        }
                    } 
                }

                if (colonne_griglia_calibrazione % 2 != 0 && righe_griglia_calibrazione % 2 != 0) 
                {
                    for (int i = 0; i < righe_griglia_calibrazione; i++)
                    {
                        for (int j = 0; j < colonne_griglia_calibrazione; j++)
                        {
                            X_Ref_B[colonne_griglia_calibrazione * i + j] = (-(colonne_griglia_calibrazione - 1) / 2 + j) * step;
                            Y_Ref_B[colonne_griglia_calibrazione * i + j] = ((righe_griglia_calibrazione - 1) / 2 - i) * step;
                        }
                    }
                }

            // Grid coordinates
            for (int k = 0; k < dim; k++)
            {
                this.Win.sw5.WriteLine("{0:#####.0000}      {1:#####.0000}      {2:#####.0000}      ", X_Ref_B[k], Y_Ref_B[k], Z_Ref_B[k]);
            }
            this.Win.sw5.WriteLine();

            Sample XKINECT = new Sample(X_Kinect);
            Sample YKINECT = new Sample(Y_Kinect);
            Sample ZKINECT = new Sample(Z_Kinect);

            // barycenter of Kinect coordinates
            double X_Bar = XKINECT.Mean;
            double Y_Bar = YKINECT.Mean;
            double Z_Bar = ZKINECT.Mean;

            //Kinect barycentric coordinates contaneirs
            double[] X_Kinect_Bar = new double[dim];
            double[] Y_Kinect_Bar = new double[dim];
            double[] Z_Kinect_Bar = new double[dim];

            //Kinect barycentric coordinates 
            for (int i = 0; i < dim; i++)
            {
                X_Kinect_Bar[i] = X_Kinect[i] - X_Bar;
                Y_Kinect_Bar[i] = Y_Kinect[i] - Y_Bar;
                Z_Kinect_Bar[i] = Z_Kinect[i] - Z_Bar;

                this.Win.sw3.WriteLine("{0:#####.0000}      {1:#####.0000}      {2:#####.0000}      ", X_Kinect_Bar[i],  Y_Kinect_Bar[i],  Z_Kinect_Bar[i]);
            }
            this.Win.sw3.WriteLine();

            //Modello rotazione + 2 parametri di scala Yoss = AX+b  oppure B = Yoss-bb = AX  X = B*A^-1

            RectangularMatrix A = new RectangularMatrix(dim * 3, 5);
            ColumnVector B = new ColumnVector(dim * 3);
            ColumnVector bb = new ColumnVector(dim * 3);
            ColumnVector Yoss = new ColumnVector(dim * 3);
            ColumnVector X = new ColumnVector(5);
            SquareMatrix X1 = new SquareMatrix(5);
            ColumnVector X2 = new ColumnVector(5);

            for (int i = 0; i < dim; i++)
            {
                
                Yoss[3 * i ] = X_Ref_B[i];
                Yoss[3 * i + 1] = Y_Ref_B[i];
                Yoss[3 * i + 2] = Z_Ref_B[i];

                A[3 * i, 0] = Y_Kinect_Bar[i];
                A[3 * i, 1] = -Z_Kinect_Bar[i];
                A[3 * i, 2] = 0.0;
                A[3 * i, 3] = X_Kinect_Bar[i];
                A[3 * i, 4] = 0.0;

                A[3 * i + 1, 0] = -X_Kinect_Bar[i];
                A[3 * i + 1, 1] = 0.0;
                A[3 * i + 1, 2] = Z_Kinect_Bar[i];
                A[3 * i + 1, 3] = 0.0;
                A[3 * i + 1, 4] = Y_Kinect_Bar[i];

                A[3 * i + 2, 0] = 0.0;
                A[3 * i + 2, 1] = X_Kinect_Bar[i];
                A[3 * i + 2, 2] = -Y_Kinect_Bar[i];
                A[3 * i + 2, 3] = 0.0;
                A[3 * i + 2, 4] = 0.0;

                bb[3 * i] = X_Kinect_Bar[i];
                bb[3 * i + 1] = Y_Kinect_Bar[i];
                bb[3 * i + 2] = Z_Kinect_Bar[i];

                B[3 * i] = X_Ref_B[i] - X_Kinect_Bar[i];
                B[3 * i + 1] = Y_Ref_B[i] - Y_Kinect_Bar[i];
                B[3 * i + 2] = Z_Ref_B[i] - Z_Kinect_Bar[i];
            }

                X1 = (SquareMatrix)(A.Transpose() * A);
                X2 = (A.Transpose() * B);
                X = (X1.Inverse()) * X2;

                a = X[0];
                b = X[1];
                c = X[2];
                lambdaX = X[3];
                lambdaY = X[4];
                this.Win.sw12.Write("{0:#####.0000}      {1:#####.0000}      {2:#####.0000}      {3:#####.0000}      {4:#####.0000}      ", a, b, c, lambdaX, lambdaY);
                this.Win.sw12.WriteLine();

                this.Win.textBlock8.Text = string.Format("Calibration parameters:\na = {0} \nb = {1} \nc = {2} \nlambdaX = {3} \nlambdaY = {4}", a, b, c, lambdaX, lambdaY);
             
            SquareMatrix ROT = new SquareMatrix(3);
            ROT[0, 0] = 1 + lambdaX;
            ROT[0, 1] = a;
            ROT[0, 2] = -b;
            ROT[1, 0] = -a;
            ROT[1, 1] = 1 + lambdaY;
            ROT[1, 2] = c;
            ROT[2, 0] = b;
            ROT[2, 1] = -c;
            ROT[2, 2] = 1;
            

           
        }